Этот запрос решил мою проблему. Все благодаря @ GMB
SELECT
Event_TimeStamp,
FinalState
FROM (
SELECT
t.*,
COALESCE(LAG(FinalState) over(ORDER BY Event_TimeStamp), 'offline') lag_final_state,
COALESCE(lead(FinalState) over(ORDER BY Event_TimeStamp), 'offline') lead_final_state
FROM (
SELECT
Event_TimeStamp,
FinalState
FROM AgentTraceData
WHERE Event_TimeStamp BETWEEN '2019-11-17' AND '2020-03-10 23:59:59.999' AND username = 'xxxx' ORDER BY Event_TimeStamp
) t
) t
WHERE FinalState <> lag_final_state
, который дает следующий результат
+---------------------------+-------------+
|"Event_TimeStamp" | "FinalState"|
+---------------------------+-------------|
|"2019-11-18 02:01:16.395" |"online" |
|"2019-11-18 04:34:59.739" |"offline" |
|"2019-11-18 04:45:08.354" |"online" |
|"2019-11-18 07:30:13.909" |"offline" |
|"2019-11-18 08:00:20.647" |"online" |
|"2019-11-18 10:30:08.698" |"offline" |
+---------------------------+-------------+
Я постараюсь объяснить как можно больше.
Сначала нам нужно выполнить запрос с SELECT *
, чтобы увидеть все появившиеся столбцы.
Вывод будет выглядеть следующим образом
+---------------------------+---------------+-------------------+------------------+
|"Event_TimeStamp" |"FinalState" |"lag_final_state" |"lead_final_state"|
+---------------------------+---------------+-------------------+------------------+
|"2019-11-18 02:01:16.395" |"online" |"offline" |"online" |
|"2019-11-18 04:34:59.739" |"offline" |"online" |"online" |
|"2019-11-18 04:45:08.354" |"online" |"offline" |"online" |
+---------------------------+---------------+-------------------+------------------+
В соответствии с моим требованием я хотел знать следующее значение FinalState
, поэтому final_state <> lead_final_state
не потребовалось.
Я добавил COALESCE()
, потому что LEAD()
и LAG()
дадут NULL
значения для строк, которые не существуют выше или после первого запроса SELECT.