SQL组中上一个/下一个日期时间不相等
我有一个由以下人员创建的表:SQL组中上一个/下一个日期时间不相等,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,我有一个由以下人员创建的表: CREATE TABLE #table1 ( category INT, event_id VARCHAR(MAX), event_time DATETIME ) INSERT INTO #table1 VALUES (1, 'event1', '2021-01-12 19:00:00'), (1, 'event2', '2021-01-12 19:00:00'), (2, 'event3', '2021-01-12 19:00:00'),
CREATE TABLE #table1
(
category INT,
event_id VARCHAR(MAX),
event_time DATETIME
)
INSERT INTO #table1
VALUES
(1, 'event1', '2021-01-12 19:00:00'),
(1, 'event2', '2021-01-12 19:00:00'),
(2, 'event3', '2021-01-12 19:00:00'),
(2, 'event4', '2021-01-12 19:30:00'),
(2, 'event5', '2021-01-12 22:30:00'),
(2, 'event6', '2021-01-12 22:30:00'),
(1, 'event7', '2021-01-12 19:30:00'),
(1, 'event8', '2021-01-12 19:30:00'),
(2, 'event9', '2021-01-12 22:30:00'),
(1, 'event10', '2021-01-12 20:00:00')
其结果是:
category event_id event_time
------------------------------------------------
1 event1 2021-01-12 19:00:00.000
1 event2 2021-01-12 19:00:00.000
2 event3 2021-01-12 19:00:00.000
2 event4 2021-01-12 19:30:00.000
2 event5 2021-01-12 22:30:00.000
2 event6 2021-01-12 22:30:00.000
1 event7 2021-01-12 19:30:00.000
1 event8 2021-01-12 19:30:00.000
2 event9 2021-01-12 22:30:00.000
1 event10 2021-01-12 20:00:00.000
我想添加两个新列:time\u of theu next\u event\u in_group
和time\u of theu previous\u event\u in_group
(我认为这是不言自明的)
我尝试使用LAG
/LEAD
进行此操作,但当组中的上一个事件具有相同的事件时间时,此操作实际上不起作用。为清楚起见,我们需要下一个/上一个事件的时间,该事件的event\u time
不同。预期结果将是:
category event_id event_time time_of_previous_event_in_group time_of_next_event_in_group
-----------------------------------------------------------------------------------------------------------------------
1 event1 2021-01-12 19:00:00.000 NULL 2021-01-12 19:30:00.000
1 event2 2021-01-12 19:00:00.000 NULL 2021-01-12 19:30:00.000
2 event3 2021-01-12 19:00:00.000 NULL 2021-01-12 19:30:00.000
2 event4 2021-01-12 19:30:00.000 2021-01-12 19:00:00.000 2021-01-12 22:30:00.000
2 event5 2021-01-12 22:30:00.000 2021-01-12 19:30:00.000 NULL
2 event6 2021-01-12 22:30:00.000 2021-01-12 19:30:00.000 NULL
1 event7 2021-01-12 19:30:00.000 2021-01-12 19:00:00.000 2021-01-12 20:00:00.000
1 event8 2021-01-12 19:30:00.000 2021-01-12 19:00:00.000 2021-01-12 20:00:00.000
2 event9 2021-01-12 22:30:00.000 2021-01-12 19:30:00.000 NULL
1 event10 2021-01-12 20:00:00.000 2021-01-12 19:30:00.000 NULL
我认为下一个查询可能会有所帮助:
SELECT
t.category,
t.event_id,
t.event_time,
MAX(b.event_time) AS time_of_previous_event_in_group,
MIN(a.event_time) AS time_of_next_event_in_group
FROM table1 t
LEFT JOIN table1 b ON t.category = b.category AND t.event_time > b.event_time
LEFT JOIN table1 a ON t.category = a.category AND t.event_time < a.event_time
GROUP BY t.category, t.event_id, t.event_time
ORDER BY LEN(t.event_id), t.event_id;
如果你不能用窗口功能来实现这一点,那真是太遗憾了,但这种方式很有效——谢谢!
+==========+==========+=========================+=================================+=============================+
| category | event_id | event_time | time_of_previous_event_in_group | time_of_next_event_in_group |
+==========+==========+=========================+=================================+=============================+
| 1 | event1 | 2021-01-12 19:00:00.000 | (null) | 2021-01-12 19:30:00.000 |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 1 | event2 | 2021-01-12 19:00:00.000 | (null) | 2021-01-12 19:30:00.000 |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 2 | event3 | 2021-01-12 19:00:00.000 | (null) | 2021-01-12 19:30:00.000 |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 2 | event4 | 2021-01-12 19:30:00.000 | 2021-01-12 19:00:00.000 | 2021-01-12 22:30:00.000 |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 2 | event5 | 2021-01-12 22:30:00.000 | 2021-01-12 19:30:00.000 | (null) |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 2 | event6 | 2021-01-12 22:30:00.000 | 2021-01-12 19:30:00.000 | (null) |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 1 | event7 | 2021-01-12 19:30:00.000 | 2021-01-12 19:00:00.000 | 2021-01-12 20:00:00.000 |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 1 | event8 | 2021-01-12 19:30:00.000 | 2021-01-12 19:00:00.000 | 2021-01-12 20:00:00.000 |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 2 | event9 | 2021-01-12 22:30:00.000 | 2021-01-12 19:30:00.000 | (null) |
+----------+----------+-------------------------+---------------------------------+-----------------------------+
| 1 | event10 | 2021-01-12 20:00:00.000 | 2021-01-12 19:30:00.000 | (null) |
+----------+----------+-------------------------+---------------------------------+-----------------------------+