Как выбрать максимальную разницу во времени между любыми 2 последовательными строками на значение? - PullRequest
0 голосов
/ 09 октября 2019

Только что пользователь ответил на этот вопрос правильно для TSQL , но ему интересно, как лучше всего добиться этого сейчас в SQL Developer / PLSQL, поскольку нет функции DATEDIFF.

Таблица, которую я хочуУ запроса on есть несколько значений 'CODE', которые, естественно, могут иметь несколько записей первичного ключа ('OccsID') в таблице 'Occs'. Для каждого OccsID также существует столбец datetime «CreateDT».

Просто хочу найти максимально возможную разницу во времени между любыми 2 последовательными строками в «Occs» для каждого «CODE».

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Предполагая, что эта версия T-SQL работает для вас (из предыдущего вопроса)

SELECT x.code, MAX(x.diff_sec) FROM
(
  SELECT 
    code,
    DATEDIFF(
        SECOND,  
        CreateDT,
        LEAD(CreateDT) OVER(PARTITION BY CODE ORDER BY CreateDT) --next row's createdt
    ) as diff_sec
  FROM Occs
)x
GROUP BY x.code

Самый простой вариант - просто вычесть две даты, чтобы получить разницу в днях. Затем вы можете умножить, чтобы получить разницу в часах, минутах или секундах

SELECT x.code, MAX(x.diff_day), MAX(x.diff_sec)
FROM
(
  SELECT 
    code,
    CreateDT -
        LEAD(CreateDT) OVER(PARTITION BY CODE ORDER BY CreateDT) as diff_day,
    24*60*60* (CreateDT -
        LEAD(CreateDT) OVER(PARTITION BY CODE ORDER BY CreateDT)) as diff_sec

  FROM Occs
)x
GROUP BY x.code
0 голосов
/ 09 октября 2019

Если вы вычтете «следующую» дату и «эту» дату (используя аналитическую функцию LEAD), вы получите разницу в дате. Затем получите максимальную разницу за code. Как то так:

with diff as
  (select occsid, 
          code, 
          nvl(lead(createdt) over (partition by code order by createdt), createdt) - createdt date_diff
   from test
  )
select code, 
       max(date_diff)
from diff
group by code;
...