如何在sql中按时间顺序计算事件?

h5qlskok  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(269)

我想把table加起来,做成table的样子。我很难按时间顺序计算事件。如何编写查询?
表a

client_id   event   time
   A        view        12:00:00
   A        view        12:02:00
   A        view        12:05:00
   A        purchase    14:02:00
   B        view        12:04:00
   B        view        12:07:00
   B        view        13:20:00
   C        view        12:00:00
   C        view        12:07:00
   C        add_to_cart 14:02:00
   C        view        14:19:00
   C        purchase    14:32:00
   C        view        15:32:00

表\u b

client_id   event   count
    A       view        3
    A       purchase    1
    B       view        3
    C       view        3
    C       add_to_cart 1
    C       view        1 
    C       purchase    1
    C       view        1
ny6fqffe

ny6fqffe1#

这是一个间隙和孤岛问题,您需要将“相邻”行分组在一起。
在这里,我认为最简单的方法是使用行号之间的差异来定义组:

select client_id, event, count(*) cnt, min(time) start_time, max(time) end_time
from (
    select 
        t.*,
        row_number() over(partition by client_id order by time) rn1,
        row_number() over(partition by client_id, event order by time) rn2
    from mytable t
) t
group by client_id, event, rn1 - rn2
order by client_id, min(time)

db小提琴演示:

client_id | event       | cnt | start_time | end_time
:-------- | :---------- | --: | :--------- | :-------
A         | view        |   3 | 12:00:00   | 12:05:00
A         | purchase    |   1 | 14:02:00   | 14:02:00
B         | view        |   3 | 12:04:00   | 13:20:00
C         | view        |   2 | 12:00:00   | 12:07:00
C         | add_to_cart |   1 | 14:02:00   | 14:02:00
C         | view        |   1 | 14:19:00   | 14:19:00
C         | purchase    |   1 | 14:32:00   | 14:32:00
C         | view        |   1 | 15:32:00   | 15:32:00

相关问题