繁体   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