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

Posted

技术标签:

【中文标题】如何在 SQL 中按时间顺序计算事件?【英文标题】:How do I count events in chronological order in SQL? 【发布时间】:2020-08-04 09:40:15 【问题描述】:

我想聚合 Talbe_A 并使其类似于 Table_B。 我很难按照时间顺序来统计事件。 我应该如何编写查询?

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

Table_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

【问题讨论】:

14:19:00 C 的视图发生了什么变化? 我忘了。我修改了问题。谢谢你。 :) @GordonLinoff 【参考方案1】:

这是一个间隙和孤岛问题,您希望将“相邻”行组合在一起。

这里我认为最简单的方法是使用行号之间的差异来定义组:

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)

Demo on DB Fiddle

客户 ID |活动 | cnt |开始时间 |时间结束 :-------- | :------------ | --: | :--------- | :-------- 一个 |查看 | 3 | 12:00:00 | 12:05:00 一个 |购买 | 1 | 14:02:00 | 14:02:00 乙|查看 | 3 | 12:04:00 | 13:20:00 C |查看 | 2 | 12:00:00 | 12:07:00 C |添加到购物车 | 1 | 14:02:00 | 14:02:00 C |查看 | 1 | 14:19:00 | 14:19:00 C |购买 | 1 | 14:32:00 | 14:32:00 C |查看 | 1 | 15:32:00 | 15:32:00

【讨论】:

以上是关于如何在 SQL 中按时间顺序计算事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular中按顺序处理2个点击事件

如何更新账单编号栏?或在 sql server 的列中按顺序排列

如何在一行中按顺序对所有项目的总金额进行分组

在 SQL 中按组中的行计算时间差异

如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?

在 sql 中按 min() 排序