我有一个表(下面是简化版),其中包含事件发生时带有时间戳的事件信息。当按 id 排序,然后使用 timestamp 排序时,我具有以下时间轴:
id status timestamp
5 1 2018-11-26 07:38:10
5 1 2018-11-26 07:37:10
5 1 2018-11-26 07:36:10
5 0 2018-11-26 07:35:10
5 0 2018-11-26 07:34:10
5 0 2018-11-26 07:33:10
5 0 2018-11-26 07:32:10
8 1 2019-07-16 12:33:22
8 1 2018-11-26 07:37:10
8 0 2018-11-26 07:36:10
8 0 2018-11-26 07:34:10
8 1 2018-11-26 07:33:10
我需要编写一个查询,以相同的状态对事件进行分组,直到事件被更改(我需要保持顺序),跟踪开始和结束时间戳和事件的发生次数,直到状态更改为止。
结果应类似于下表
id status Start timestamp end timestamp count
5 1 2018-11-26 07:38:10 2018-11-26 07:36:10 3
5 0 2018-11-26 07:35:10 2018-11-26 07:32:10 4
8 1 2019-07-16 12:33:22 2018-11-26 07:37:10 2
8 0 2018-11-26 07:36:10 2018-11-26 07:34:10 3
8 1 2018-11-26 07:33:10 2018-11-26 07:33:10 1
我知道我可以使用ROW_NUMBERS()解决问题,但据我所知,Amazon Aurora等同于MySQL 5.6,因此不支持它。
此刻,我停留在如何遍历结果列表和分组的事情上。我正在尝试类似的嵌套查询,并尝试在此基础上构建
SELECT *
# , min(reported_timestamp), max(reported_timestamp), count(*)
FROM (
SELECT id, status, reported_timestamp
FROM table AS td
#GROUP BY id, status
#, reported_timestamp
ORDER BY id, reported_timestamp DESC
) k
# GROUP BY id, status
;
我对查询还有另一个担心,因为它需要分页,而我为此使用了Spring Boot和Hibernate。
我还可以编写Java代码来迭代并在应用程序中创建对象,但是我们有数百万条记录,这可能会非常慢。