Проблема T-SQL с опережением или отставанием - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть таблица, в которой есть столбцы 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 

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

Query Results

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

Как видите, я потерян: -).

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

Майк

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, что вы хотите использовать 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() на любое значение по умолчанию, если нет ведущей записи.

...