SQL比较同一表中多行中的记录

SQL比较同一表中多行中的记录,sql,select,Sql,Select,我有表:端口号、对号、长度、添加日期。 例如: 总共有4对(A、B、C、D),每个端口至少有一对(A-D)。这意味着,每个端口可以重复多次。我需要知道端口的任何对长度是否增加了30m。为此,我必须按日期订购每个port_nbr,因为我需要将一条记录与下一条记录进行比较,并找出它何时增加了30m 例如: 记录1 重现2 port_nbr | 1 pair | pairA length | 65.00 add_date | 20

我有表:端口号、对号、长度、添加日期。 例如:

总共有4对(A、B、C、D),每个端口至少有一对(A-D)。这意味着,每个端口可以重复多次。我需要知道端口的任何对长度是否增加了30m。为此,我必须按日期订购每个port_nbr,因为我需要将一条记录与下一条记录进行比较,并找出它何时增加了30m

例如: 记录1

重现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增加35米

有数百条记录,我必须将一条记录与另一条记录进行比较,但必须是相同的端口和端口对

我现在拥有的一切是:

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()

这将获取同一零件/配对组合的下一个长度,并返回下一个值超过阈值的行。

使用
LAG()
窗口函数:

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

我想这应该行得通,但我忘了一件重要的事。。。长度是一个变化的字符。这意味着我需要将数据类型更改为浮点型(因为数字可以是小数),并且有些值是N/A,这意味着我需要包含
length!='不适用“
但我不知道如何将其包含到您的代码中。。。另外,我知道我可以使用
length::float
更改数据类型,但我不知道该将其放置在何处。错误-运算符不存在:字符变化+integer@Cris . . . 我建议您提出一个新问题,包括适当的示例数据、期望的结果,以及——重要的——一个数据库标记。我正在使用groovy和psql。我的数据库有一个表,其中有数百条记录。有许多不同的端口(端口号)。每个端口对每个端口(pairA、pairB、pairC、pairD)至少有1条记录。每个端口可以有多个pairA,我需要比较该端口的所有pairA,并找出2条记录之间是否有任何长度变化。我需要将最早的数据按最新的顺序排列,然后我需要比较它的所有记录。例如,精确端口最早的记录和精确端口对比较第二个最早的记录,然后是第二个和第三个,等等。我有很多端口,每个端口都有许多成对的记录(a、b、c、d)。我被卡住了,因为这个任务对我来说太难了。如果可以,我会发送截图。
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
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;
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