假设我有一张带有日志的桌子。两列:第一列包含用户名,第二列包含记录时间戳。 如果每个用户处于活动状态,则每 10 分钟就会在表中显示一次记录。
用户1 07/08/2024 20:10:00,000000
用户2 07/08/2024 20:10:00,000000
用户3 07/08/2024 20:10:00,000000
用户1 07/08/2024 20:20:00,000000
用户2 07/08/2024 20:20:00,000000
用户3 07/08/2024 20:20:00,000000
用户1 07/08/2024 20:30:00,000000
用户2 07/08/2024 20:30:00,000000
用户3 07/08/2024 20:30:00,000000
用户2 07/08/2024 20:40:00,000000
用户3 07/08/2024 20:40:00,000000
用户1 07/08/2024 20:50:00,000000
用户2 07/08/2024 20:50:00,000000
用户3 07/08/2024 20:50:00,000000
用户1 07/08/2024 21:00:00,000000
用户1 07/08/2024 21:10:00,000000
用户3 07/08/2024 22:00:00,000000
用户3 07/08/2024 22:20:00,000000
用户3 07/08/2024 22:30:00,000000
从这样的表中我需要显示数据:
所以结果应该是这样的:
用户 | 开始 | 结束 |
---|---|---|
用户1 | 2024年7月8日20:10:00,000000 | 2024年7月8日20:30:00,000000 |
用户2 | 2024年7月8日20:10:00,000000 | 2024年7月8日20:50:00,000000 |
用户3 | 2024年7月8日20:10:00,000000 | 2024年7月8日20:50:00,000000 |
用户1 | 2024年7月8日20:50:00,000000 | 2024年7月8日21:10:00,000000 |
用户3 | 07/08/2024 22:00:00,000000 | 2024年7月8日22:10:00,000000 |
用户3 | 2024年7月8日22:20:00,000000 | 2024年7月8日22:30:00,000000 |
我不知道如何编写这样的查询
从 Oracle 12 开始,您可以使用
MATCH_RECOGNIZE
进行逐行模式匹配:
SELECT *
FROM table_name
MATCH_RECOGNIZE(
PARTITION BY username
ORDER BY datetime
MEASURES
FIRST(datetime) AS begin_time,
LAST(datetime) AS end_time
PATTERN ( first_time consecutive_times* )
DEFINE
consecutive_times AS datetime <= PREV(datetime) + INTERVAL '10' MINUTE
)
对于样本数据:
CREATE TABLE table_name (username, datetime) AS
SELECT 'user1', TIMESTAMP '2024-08-07 20:10:00.000000' FROM DUAL UNION ALL
SELECT 'user2', TIMESTAMP '2024-08-07 20:10:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 20:10:00.000000' FROM DUAL UNION ALL
SELECT 'user1', TIMESTAMP '2024-08-07 20:20:00.000000' FROM DUAL UNION ALL
SELECT 'user2', TIMESTAMP '2024-08-07 20:20:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 20:20:00.000000' FROM DUAL UNION ALL
SELECT 'user1', TIMESTAMP '2024-08-07 20:30:00.000000' FROM DUAL UNION ALL
SELECT 'user2', TIMESTAMP '2024-08-07 20:30:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 20:30:00.000000' FROM DUAL UNION ALL
SELECT 'user2', TIMESTAMP '2024-08-07 20:40:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 20:40:00.000000' FROM DUAL UNION ALL
SELECT 'user1', TIMESTAMP '2024-08-07 20:50:00.000000' FROM DUAL UNION ALL
SELECT 'user2', TIMESTAMP '2024-08-07 20:50:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 20:50:00.000000' FROM DUAL UNION ALL
SELECT 'user1', TIMESTAMP '2024-08-07 21:00:00.000000' FROM DUAL UNION ALL
SELECT 'user1', TIMESTAMP '2024-08-07 21:10:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 22:00:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 22:20:00.000000' FROM DUAL UNION ALL
SELECT 'user3', TIMESTAMP '2024-08-07 22:30:00.000000' FROM DUAL;
输出:
用户名 | BEGIN_TIME | END_TIME |
---|---|---|
用户1 | 2024-08-07 20:10:00.000000000 | 2024-08-07 20:30:00.000000000 |
用户1 | 2024-08-07 20:50:00.000000000 | 2024-08-07 21:10:00.000000000 |
用户2 | 2024-08-07 20:10:00.000000000 | 2024-08-07 20:50:00.000000000 |
用户3 | 2024-08-07 20:10:00.000000000 | 2024-08-07 20:50:00.000000000 |
用户3 | 2024-08-07 22:00:00.000000000 | 2024-08-07 22:00:00.000000000 |
用户3 | 2024-08-07 22:20:00.000000000 | 2024-08-07 22:30:00.000000000 |