保持一组行按 min(time) 排序而不使用 group by
Keep group of rows together ordered by min(time) without using group by
我有 table 用户执行操作时生成的事件。它看起来大致是这样的:
session | time | event | etc.
06efaa1805ef670c | 2022-01-07 08:41:03 | lockFound | etc.
06efaa1805ef670c | 2022-01-07 08:41:43 | lockLost | etc.
154032b09bec72f8 | 2022-01-07 10:41:03 | lockFound | etc.
154032b09bec72f8 | 2022-01-07 10:41:43 | lockLost | etc.
我需要按特定顺序获取所有这些事件:
- 它们必须按会话 ID 分组,这样来自一个会话的所有事件都会出现在一起
- 会话必须按时间顺序排列(最好是会话中第一个事件的时间)
- 会话中事件的顺序实际上并不重要
- 我不想使用 GROUP BY,因为我需要 table
中的每个事件
我该如何设置?
实际数据为here
检索人:
SELECT * FROM dlrcoco_events ORDER BY time DESC`
如果使用 MySQL 8 或更高版本,则可以使用 window 函数:
SELECT *
FROM dlrcoco_events
ORDER BY MIN(time) OVER (PARTITION BY session), session, time
订单说明:
- 第一列将包含相应会话中第一个事件的时间。
- 可以有两个最短时间相同的会话,在这种情况下,您必须通过将
session
作为第二列来打破平局。这确保属于同一会话的行保持在一起。
- 最后,对于每个会话,您按事件时间排序。
window 函数可以替换为相关子查询:
ORDER BY (
SELECT MIN(time)
FROM dlrcoco_events AS x
WHERE x.session = dlrcoco_events.session
), -- other columns as described above
我有 table 用户执行操作时生成的事件。它看起来大致是这样的:
session | time | event | etc.
06efaa1805ef670c | 2022-01-07 08:41:03 | lockFound | etc.
06efaa1805ef670c | 2022-01-07 08:41:43 | lockLost | etc.
154032b09bec72f8 | 2022-01-07 10:41:03 | lockFound | etc.
154032b09bec72f8 | 2022-01-07 10:41:43 | lockLost | etc.
我需要按特定顺序获取所有这些事件:
- 它们必须按会话 ID 分组,这样来自一个会话的所有事件都会出现在一起
- 会话必须按时间顺序排列(最好是会话中第一个事件的时间)
- 会话中事件的顺序实际上并不重要
- 我不想使用 GROUP BY,因为我需要 table 中的每个事件
我该如何设置?
实际数据为here
检索人:
SELECT * FROM dlrcoco_events ORDER BY time DESC`
如果使用 MySQL 8 或更高版本,则可以使用 window 函数:
SELECT *
FROM dlrcoco_events
ORDER BY MIN(time) OVER (PARTITION BY session), session, time
订单说明:
- 第一列将包含相应会话中第一个事件的时间。
- 可以有两个最短时间相同的会话,在这种情况下,您必须通过将
session
作为第二列来打破平局。这确保属于同一会话的行保持在一起。 - 最后,对于每个会话,您按事件时间排序。
window 函数可以替换为相关子查询:
ORDER BY (
SELECT MIN(time)
FROM dlrcoco_events AS x
WHERE x.session = dlrcoco_events.session
), -- other columns as described above