如何在 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 中按时间顺序计算事件?的主要内容,如果未能解决你的问题,请参考以下文章
如何更新账单编号栏?或在 sql server 的列中按顺序排列