SQL сравнить записи в нескольких строках одной таблицы - PullRequest
0 голосов
/ 12 июля 2020

У меня есть таблица с: 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 может быть несколько раз. Мне нужно узнать, увеличена ли длина любой пары этого порта на 30 м. Для этого я должен упорядочить каждый port_nbr по дате, потому что мне нужно сравнить 1 запись со следующей записью и узнать, когда она увеличилась на 30 м

пример: ЗАПИСЬ 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, пара A, 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

Было бы очень полезно, если бы кто-то мог объяснить, что я должен попробуйте добавить, чтобы получить ожидаемый результат.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

С функцией окна 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
0 голосов
/ 12 июля 2020

Я думаю, вы просто хотите 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;

Это получает следующую длину для той же комбинации часть / пара и возвращает строки, где следующее значение превышает ваш порог.

...