【问题标题】:Cohort Analysis on SaaS Users in SQLSQL 中 SaaS 用户的队列分析
【发布时间】:2020-08-06 20:23:14
【问题描述】:

我有一些 SaaS 用户数据,如下所示:

start_month end_month   User_Id
2019-10 2019-10 1
2019-10 2019-11 2
2019-10 2019-12 3
2019-10 2019-12 4
2019-11 2019-11 5
2019-11 2019-12 6
2019-11 2019-12 7
2019-11 2020-01 8
2019-12 2019-12 9
2019-12 2020-01 10
2019-12  NULL   11
2019-12 2020-02 12

如您所见,数据包含订阅开始日期和订阅结束日期。

start_month 和 end_month 是从开始日期创建的字符串 TO_CHAR(date_trunc('month', start_date), 'yyyy-MM') AS start_month

如果订阅仍然有效,end_month 可以为空。

这是一个 postgresql 数据库。

使用这些数据,我需要创建一个同类群组报告,其中应该显示每个月有多少人开始订阅,以及从该同类群组中,有多少人在下个月结束了订阅。上述数据中,2019-10 年有 4 名用户入职。 1 个在同一个月结束 (0),1 个在第 1 个月结束,2 个在第 2 个月结束。同样,我们应该为其他开始月份的同类群组获取。

很抱歉,我完全不知道如何才能得出这份报告。我搜索了互联网,但找不到任何相关答案,其中仅使用开始和结束日期创建群组。请帮忙。

【问题讨论】:

  • 第一:使用正确的数据类型(日期),这样比较容易。第二:使用 +inf 而不是 NULL 来表示一个永久的间隔。第三:你需要一个日历表。

标签: sql postgresql


【解决方案1】:

如果我理解正确,可以使用条件聚合:

select start_month, count(*),
       count(*) filter (where end_month is null or to_date(end_month, 'YYYY-MM') >= to_date(start_month, 'YYYY-MM') + interval '1 month') as month_1,
       count(*) filter (where end_month is null or to_date(end_month, 'YYYY-MM') >= to_date(start_month, 'YYYY-MM') + interval '2 month') as month_2
from users u
group by start_month;

Here 是一个数据库小提琴

【讨论】:

  • 我会试试这个。但我不明白的是,内部用户表和外部表都是别名'u'。可以吗?
  • @asanas 。 . .是的,没关系,但不应该有内部查询。
  • 非常感谢您的努力。但结果并不如我所料。例如,对于2019-10年加入的用户,同月_0(2019-10)离开1个,month_1(2019-11)离开1个,month_2(2019_12)离开2个。该表应显示随后每个月剩余数量的数据。是否可以灵活地使其提前 n 个月而不是仅仅 2 个月?再次感谢。
  • @asanas 。 . .这应该是那些没有离开的人:“有多少人在下个月结束了订阅。”您可以按照类似的逻辑添加更多月份。
  • 是的,当然,感谢它的效果很好。我只是想让相反的工作。也就是说,显示每个月有多少人离开。这段代码有可能吗?
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
相关资源
最近更新 更多