簡體   English   中英

SQL 比較同一張表多行記錄

[英]SQL compare records in multiple rows in same table

我有一張桌子:Port_nbr、Pair、length、add_date。 例子:

port_nbr        | 4
pair            | pairC
length          | 33.12
add_date        | 2020-06-16 00:01:13.237164

總共有 4 對 (A,B,C,D),每個 port_nbr 至少有一對 (AD)。 這意味着,每個 port_nbr 可以是多次。 我需要確定該端口的任何對長度是否增加了 30m。 為此,我必須按日期對每個 port_nbr 進行排序,因為我需要將 1 條記錄與下一條記錄進行比較,並找出它何時增加了 30m

示例:記錄 1

port_nbr | 1                          
pair     | pairA
length   | 30.00
add_date | 2020-06-16 00:01:13.237164

記錄 2

port_nbr | 1                              
pair     | pairA
length   | 65.00
add_date | 2020-06-16 00:02:13.237164

預期輸出 - 長度增加:端口 1,pairA,2020-06-16 00:02:13.237164 by 35m

有數百條記錄,我必須將一條記錄與另一條記錄進行比較,但它必須是相同的端口和配對。

我現在擁有的一切是:

Select *
from diags a join
     (SELECT port_nbr, count(*) from diags group by port_nbr having count(*) > 1 ) b
     on a.port_nbr = b.port_nbr
order by a.port_nbr

如果有人可以解釋我應該嘗試添加什么以獲得預期的結果,那將有很大幫助。

我想你只想要lead()

select d.*
from (select d.*,
             lead(length) over (partition by port_nbr, pair order by add_date) as next_length
      from diags d
     ) d
where next_length > length + 30;

這將獲取相同部分/對組合的下一個長度,並返回下一個值超過閾值的行。

使用LAG() window function:

select port_nbr, pair, length, add_date, diff
from (
  select *, length - lag(length) over (partition by port_nbr, pair order by add_date) diff
 from tablename
) t
where diff > 30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM