Проблема T-SQL с использованием опережения или запаздывания

У меня есть таблица с столбцами EVENT_ACTION и TIMESTAMP; в столбце EVENT_ACTION есть два возможных значения: 225 и 226.

225 представляют start_time и 226 представляют end_time; поскольку они находятся в двух разных строках, я пытаюсь использовать LAG или LEAD, и у меня есть некоторые проблемы.

Вот что у меня есть на данный момент; столбец MRDF - это мой уникальный идентификатор:

SELECT  
    f.EVENT_ACTION ,
    (f.TIMESTAMP) AS starttime, 
    LEAD(f.TIMESTAMP) OVER (ORDER BY f.MRDF) AS endtime 
FROM  
    dbo.flext f 
WHERE 
    EVENT_ACTION IN (225,226) 
ORDER BY 
    MRDF, EVENT_ACTION 

Вот что я получаю: теперь он получает временную метку следующей строки, как я и думал:

Результаты запроса

Я получаю нулевое значение для моего последнего EVENT_ACTION 255. Я планирую поместить его во временную таблицу и использовать только EVENT_ACTION 225.

Как видите, я заблудился :-).

Любая помощь будет оценена

Майк


person Mike    schedule 01.11.2018    source источник
comment
Не могли бы вы показать схему исходной таблицы и некоторые образцы данных, пожалуйста   -  person Peter Smith    schedule 01.11.2018


Ответы (1)


Я думаю, вы хотите использовать f.TIMESTAMP в качестве ORDER BY для LEAD(). Думаю, ваш запрос должен выглядеть примерно так:

SELECT  
    f.EVENT_ACTION ,
    (f.TIMESTAMP) AS starttime, 
    LEAD(f.TIMESTAMP) OVER (ORDER BY f.TIMESTAMP ASC) AS endtime 
FROM  
    dbo.flext f 
WHERE 
    EVENT_ACTION IN (225,226) 
ORDER BY MRDF, EVENT_ACTION 

Однако это все равно оставит вам NULL для времени окончания вашей последней 226-й записи. Таким образом, вы можете добавить значение по умолчанию к функции LEAD() для этой ситуации. Синтаксис:

LEAD ( scalar_expression [ ,offset ] , [ default ] ) 

Используя этот синтаксис, ваш LEAD() станет:

LEAD(f.TIMESTAMP, 1, GETDATE()) OVER (ORDER BY f.TIMESTAMP ASC) AS endtime

Вы можете заменить GETDATE() на любое значение по умолчанию, когда нет ведущей записи.

person digital.aaron    schedule 01.11.2018