[英]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.