【问题标题】:Aggregate count by several weeks after field data in PostgreSQL在 PostgreSQL 中的字段数据后几周聚合计数
【发布时间】:2015-06-19 21:05:01
【问题描述】:

我有一个查询返回类似的内容:
registered_at - 用户注册日期;
action_at - 某种行动的日期。 p> |注册地址 |用户 ID | action_at | -------------------------------------------------- ----- | 2015-05-01 12:00:00 | 1 | 2015-05-04 12:00:00 | | 2015-05-01 12:00:00 | 1 | 2015-05-10 12:00:00 | | 2015-05-01 12:00:00 | 1 | 2015-05-16 12:00:00 | | 2015-04-01 12:00:00 | 2 | 2015-04-04 12:00:00 | | 2015-04-01 12:00:00 | 2 | 2015-04-05 12:00:00 | | 2015-04-01 12:00:00 | 2 | 2015-04-10 12:00:00 | | 2015-04-01 12:00:00 | 2 | 2015-04-30 12:00:00 |

我正在尝试实现将返回类似以下内容的查询:
weeks_after_registration - 在此示例中限制为 3,在实际任务中限制为 6。

|用户 ID | week_after_registration |动作计数 | -------------------------------------------------- ----- | 1 | 1 | 1 | | 1 | 2 | 1 | | 1 | 3 | 1 | | 2 | 1 | 2 | | 2 | 2 | 1 | | 2 | 3 | 0 |

【问题讨论】:

    标签: postgresql aggregate


    【解决方案1】:

    您可以使用extract(days from (action_at - registered_at) / 7)+1 获取周数。然后计算按周数分组的操作数。

      select user_id, wk, count(*) actions
      from (select user_id, extract(days from (action_at - registered_at) / 7)+1 wk from Table1) a
      where wk <= 3
      group by user_id, wk
    

    如果您必须在结果中显示 action_counts = 0 的行,那么您需要加入所有可能的周数 (1, 2, 3) 和所有可能的 user_ids (1, 2),例如:

    select b.user_id, a.wk, coalesce(c.actions, 0) actions
    from (select * from generate_series(1, 3) wk) a
    join (select distinct user_id from Table1) b on true
    left join (
      select user_id, wk, count(*) actions
      from (select user_id, extract(days from (action_at - registered_at) / 7)+1 wk from Table1) a
      where wk <= 3
      group by user_id, wk
    ) c on a.wk = c.wk and b.user_id = c.user_id
    order by b.user_id, a.wk;
    

    fiddle

    【讨论】:

    • 谢谢。你太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多