保持一组行按 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.

我需要按特定顺序获取所有这些事件:

  1. 它们必须按会话 ID 分组,这样来自一个会话的所有事件都会出现在一起
  2. 会话必须按时间顺序排列(最好是会话中第一个事件的时间)
  3. 会话中事件的顺序实际上并不重要
  4. 我不想使用 GROUP BY,因为我需要 table
  5. 中的每个事件

我该如何设置?

实际数据为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