![](/img/trans.png)
[英]compare multiple set of rows in same table - bulk records efficient way needed-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.