【发布时间】:2021-03-07 13:27:13
【问题描述】:
我有代码将我的数据分区为间隙和孤岛解决方案。数据本身根据记录的时间戳和活动报告用户活动、工作时间和空闲时间。我的代码运行良好,但每隔一段时间我就有一个 user_id 记录一个应用程序的一系列活动,然后进入空闲状态,然后返回到同一个应用程序以记录其他活动。根据我当前的代码,看起来用户在一个应用程序中花费了将近两个小时,而实际上中间有很长的停机时间。我想“强制”创建一个岛,如果活动之间的间隔超过 30 分钟,则重新启动分区。
ACTIVITY_DATE | USER_ID | APPL_ID | PR1 | PR2
---------------------------------------------------
11/20/2020 10:55 A 9340 1 1
11/20/2020 10:55 A 9340 2 2
11/20/2020 10:58 A 9340 3 3
11/20/2020 10:58 A 9340 4 4
11/20/2020 10:59 A 9340 5 5
11/20/2020 13:09 A 9340 6 6
11/20/2020 13:09 A 9340 7 7
11/20/2020 13:10 A 9340 8 8
11/20/2020 13:10 A 9340 9 9
11/20/2020 17:12 A 8354 10 1
11/20/2020 17:14 A 8354 11 2
11/20/2020 17:14 A 8354 12 3
最终结果需要重启本例中第六行PR2列的分区,因为同一个appl_id记录的activity之间的间隔超过了30min:
ACTIVITY_DATE | USER_ID | APPL_ID | PR1 | PR2
---------------------------------------------------
11/20/2020 10:55 A 9340 1 1
11/20/2020 10:55 A 9340 2 2
11/20/2020 10:58 A 9340 3 3
11/20/2020 10:58 A 9340 4 4
11/20/2020 10:59 A 9340 5 5
11/20/2020 13:09 A 9340 6 1
11/20/2020 13:09 A 9340 7 2
11/20/2020 13:10 A 9340 8 3
11/20/2020 13:10 A 9340 9 4
11/20/2020 17:12 A 8354 10 1
11/20/2020 17:14 A 8354 11 2
11/20/2020 17:14 A 8354 12 3
这是我当前的代码:
select activity_date, user_id, appl_id,
row_number() over(partition by user_id order by activity_date) rn1,
row_number() over(partition by user_id, appl_id order by activity_date) rn2
from
(select
activity_date, user_id, appl_id, count(*)
from mytable tt
where
user_id in ('A', 'B', 'C')
and activity_date >= trunc(sysdate - 4,'DD')
and activity_date <= trunc(sysdate - 3,'DD')
group by
activity_date, user_id, appl_id) tt
【问题讨论】:
-
您的 Oracle 版本是多少?
-
@mathguy 我正在使用 Toad 数据点 4.3.0.718(64 位)
-
我指的是 Oracle 数据库版本,而不是 Toad 版本。如果你不知道,运行 select * from v$version;看看它说了什么。
-
@mathguy Oracle Database 12c 企业版 12.2.0.1.0 版
标签: oracle partition gaps-and-islands