找到> 10分钟的间隙并在时间戳日志中选择开始/结束日期

问题描述 投票:0回答:1

假设我有一张带有日志的桌子。两列:第一列包含用户名,第二列包含记录时间戳。 如果每个用户处于活动状态,则每 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

从这样的表中我需要显示数据:

  • 用户
  • 开始(日志序列的开始)
  • end(日志序列结束) 序列意味着所选用户的记录每 10 分钟出现一次,因此每个间隔 > 10 分钟都会结束当前序列,下一个日期开始下一个序列。如果只有一条记录,那么我需要将此记录显示为开始,并添加 10 分钟开始时间戳以设置结束。

所以结果应该是这样的:

用户 开始 结束
用户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

我不知道如何编写这样的查询

sql oracle
1个回答
0
投票

从 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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.