我希望有人能帮忙;我把自己归类为oracle/sql的新手,但到目前为止,我已经设法得到了我需要的东西,但在如何处理我的查询方面遇到了困难。
我有一个activites的数据集,每个activity都有一个惟一的id,在其整个生命周期中是一致的;每个活动都有多个以时间表示的事件;每个事件可以有不同的状态。请参见下面的示例集。
我想要实现的是一个列表,其中包含按活动id和时间排序的数据,每个活动都有一个增量id(1、2、3、4);但是我还需要一个第二列,它从1开始,当状态与前一行不同时递增。
下面是我的数据示例:
ACTIVITY_ID | EVENT_TIMESTAMP | EVENT_STATUS
--------------------------------------------------------
A001 | 01/01/2020 09:00:00 | STATUS A
A001 | 01/01/2020 10:10:00 | STATUS B
A001 | 01/01/2020 11:20:00 | STATUS C
A001 | 01/01/2020 12:30:00 | STATUS C
A002 | 01/01/2020 13:40:00 | STATUS F
A002 | 01/01/2020 17:50:00 | STATUS F
A002 | 01/01/2020 17:53:00 | STATUS G
利用行号和分区,我得到了一个输出,它给出了我的有序列表,如下所示:
ACTIVITY_ID | EVENT_TIMESTAMP | EVENT_STATUS | EVENT_NUMBER
--------------------------------------------------------------------
A001 | 01/01/2020 09:00:00 | STATUS A | 1
A001 | 01/01/2020 10:10:00 | STATUS B | 2
A001 | 01/01/2020 11:20:00 | STATUS C | 3
A001 | 01/01/2020 12:30:00 | STATUS C | 4
A002 | 01/01/2020 13:40:00 | STATUS F | 1
A002 | 01/01/2020 17:50:00 | STATUS F | 2
A002 | 01/01/2020 17:53:00 | STATUS G | 3
我正在纠结的是我要查找的子分组结果(如下),这是否应该与行号相同,但根据事件状态使用分区?我尝试过各种尝试,但是当状态更改时,分区总是重置为1,而不是从1开始,然后随着每次更改而递增?
ACTIVITY_ID | EVENT_TIMESTAMP | EVENT_STATUS | EVENT_NUMBER | EVENT_STATUS_GROUP
----------------------------------------------------------------------------------------
A001 | 01/01/2020 09:00:00 | STATUS A | 1 | 1
A001 | 01/01/2020 10:10:00 | STATUS B | 2 | 2
A001 | 01/01/2020 11:20:00 | STATUS C | 3 | 3
A001 | 01/01/2020 12:30:00 | STATUS C | 4 | 3
A001 | 01/01/2020 12:30:00 | STATUS A | 5 | 4
A002 | 01/01/2020 13:40:00 | STATUS F | 1 | 1
A002 | 01/01/2020 17:50:00 | STATUS F | 2 | 1
A002 | 01/01/2020 17:53:00 | STATUS G | 3 | 2
我希望这是足够清楚,如果没有,请不要问任何问题。
3条答案
按热度按时间xxls0lw81#
你可以用
lag()
和一个累计总和来计算变化的次数:这是一把小提琴。
zlhcx6iw2#
你可以用
DENSE_RANK()
分析函数:演示
kcwpcxri3#
您可以使用moder match\u来识别:
结果:
完整示例(我在您的示例中添加了一行):