SQL保留队列分析

时间:2019-04-12 10:08:02

标签: sql postgresql retention

我正试图编写一个查询每月保留时间的方法,以计算从最初的开始月份返回并前进的用户百分比。

TABLE: customer_order
fields
id
date
store_id

TABLE: customer
id
person_id
job_id
first_time (bool)

这使我获得了基于首次约会的最初每月队列

SELECT first_job_month, COUNT( DISTINCT person_id) user_counts
FROM 
   ( SELECT DATE_TRUNC(MIN(CAST(date AS DATE)), month) first_job_month, person_id
FROM customer_order cd
INNER JOIN consumer co ON co.job_id = cd.id
GROUP BY 2
ORDER BY 1 ) first_d GROUP BY 1 ORDER BY 1

first_job_month   user_counts
2018-04-01        36

2018-05-01        37

2018-06-01        39

2018-07-01        45

2018-08-01        38

我尝试了很多事情,但是我不知道如何从第一个月开始跟踪原始群组/用户

1 个答案:

答案 0 :(得分:0)

  1. 获取每个客户的第一个订单月
  2. 将订单加入上一个子查询,以找出给定订单和第一个订单之间的月份差异
  3. 使用条件汇总来统计仍按X个月订购的客户

还有其他一些选择,例如使用窗口函数在同一子查询中执行(1)和(2),但最简单的选择是这个:

WITH
cohorts as (
    SELECT person_id, DATE_TRUNC(MIN(CAST(date AS DATE)), month) as first_job_month
    FROM customer_order cd
    JOIN consumer co 
    ON co.job_id = cd.id
    GROUP BY 1
)
,orders as (
    SELECT
     *
    ,round(1.0*(DATE_TRUNC(MIN(CAST(cd.date AS DATE))-c.first_job_month)/30) as months_since_first_order
    FROM cohorts c
    JOIN customer_order cd
    USING (person_id)
)
SELECT
 first_job_month as cohort
,count(distinct person_id) as size
,count(distinct case when months_since_first_order>=1 then person_id end) as m1
,count(distinct case when months_since_first_order>=2 then person_id end) as m2
,count(distinct case when months_since_first_order>=3 then person_id end) as m3
-- hardcode up to the number of months you want and the history you have
FROM orders 
GROUP BY 1
ORDER BY 1

请参见,您可以在CASE之类的聚合函数中使用COUNT语句来标识要在同一组中聚合的不同行子集。这是SQL中最重要的BI技术之一。

请注意,条件汇总中使用的是>=而不是=,例如,如果客户在m3之后购买了m1而没有购买{{ 1}},它们仍将计入m2中。如果您希望客户每个月购买一次和/或查看每个月的实际保留量,并且以后的月份值可以高于之前的值,则可以使用m2

此外,如果您不希望从该查询中获得“三角形”视图,或者不想对“ mX”部分进行硬编码,则只需按=和{{1 }}并计算在内。一些可视化工具可能会使用这种简单格式,并从中制作出三角形视图。