【问题标题】:How to build a churn funnel by dates having start and end date in PostgreSQL如何在 PostgreSQL 中通过具有开始和结束日期的日期来构建流失漏斗
【发布时间】:2022-11-11 23:20:25
【问题描述】:

我在 PostgreSQL 中有一张表,上面有我们客户取消订阅我们服务的结束日期的开始日期

user_id date disactivated_at
1 October 28, 2021
2 October 28, 2021
3 October 28, 2021 August 26, 2022
4 October 28, 2021
5 October 28, 2021
6 October 28, 2021 March 29, 2022
7 October 28, 2021
8 October 28, 2021
9 October 28, 2021 August 26, 2022
10 October 28, 2021
11 October 28, 2021 March 30, 2022
12 October 28, 2021
13 October 28, 2021
14 October 28, 2021 February 4, 2022
15 October 28, 2021
16 October 28, 2021
17 October 28, 2021
18 October 28, 2021 January 19, 2022
19 October 28, 2021
20 October 28, 2021

我怎样才能有一个表格,显示我们每个月(或一周或一天)有多少活跃用户?

理想的结果是:

Month Active_users
November 20
December 20
January 19
February 18
March 16
April 16
May 16
June 16
July 16
August 14
September 14

不幸的是,我没有自己的代码草稿,因为我不知道从哪里开始。基本分组方法在这里不起作用(如果我现在需要知道实际的活跃用户数,它可以工作,但我也需要之前的每个时间段)。

【问题讨论】:

    标签: sql postgresql data-analysis


    【解决方案1】:

    有点复杂,但一步一步很简单—— 建立一个月(或周,或天)列表 - t_months_list CTE,将其与"date"-s 修剪为月(或周或日)的用户列表一起添加为"month" - t_list CTE - 使用"month",然后使用aggregate with filtering

    with
    t_months_list as 
    (
     select generate_series('2021-10-01', '2022-09-01', interval '1 month')::date "month"
    ),
    t_list as 
    (
     select date_trunc('month', "date")::date "month", "date", desactivated_at 
     from the_table
    )
    select tml."month",
      count(*) filter 
        (
          where tl."date" is not null 
          and (desactivated_at is null or desactivated_at > tml."month")
        ) as active_users
    from t_months_list tml left join t_list tl on tml."month" >= tl."month"
    group by tml."month"
    order by tml."month";
    

    db-fiddle 上的演示
    请注意,使用保留字(即月份、日期)作为列名不是一个好主意。

    【讨论】:

    • 感谢您的尝试,但它显示了意外的结果(请参阅我的问题中的理想结果以及您在 db-fiddle 链接中的查询结果)。由于某种原因,您的查询仅显示 10 月份的所有用户,而其他月份则显示为零。
    • 鉴于您的数据仅包含 2021 年 10 月的样本,因此结果完全符合预期。如果这是错误的,那么您可以更改过滤表达式。
    • 这很奇怪。我还对示例数据运行查询,它显示的结果与此处相同 - db-fiddle.com/f/sVoT6m6Jy8MtaZnTnL9cVN/0 但请再次检查,这不是正确的结果。
    • 是的,过滤表达式错误的。试着自己弄清楚。
    • 好吧,连接条件和过滤表达式都是错误的。答案已更新并产生所需的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多