【问题标题】:How do I count events in chronological order in SQL?如何在 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

标签: sql time amazon-redshift window-functions gaps-and-islands


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2018-11-05
    • 1970-01-01
    • 2010-10-17
    • 2019-04-15
    • 2018-08-27
    相关资源
    最近更新 更多