试图获得一个显示从一个月到下一个月的保留率的基本表格。因此,如果有人上个月买了东西,而他们在下个月又买了,那么它就会被计算在内。
month, num_transactions, repeat_transactions, retention
2012-02, 5, 2, 40%
2012-03, 10, 3, 30%
2012-04, 15, 8, 53%
因此,如果上个月购买的每个人都在下个月再次购买,那么您将获得 100%。
到目前为止,我只能手动计算东西。这给了我在这两个月中看到的行:
select count(*) as num_repeat_buyers from
(select distinct
to_char(transaction.timestamp, 'YYYY-MM') as month,
auth_user.email
from
auth_user,
transaction
where
auth_user.id = transaction.buyer_id and
to_char(transaction.timestamp, 'YYYY-MM') = '2012-03'
) as table1,
(select distinct
to_char(transaction.timestamp, 'YYYY-MM') as month,
auth_user.email
from
auth_user,
transaction
where
auth_user.id = transaction.buyer_id and
to_char(transaction.timestamp, 'YYYY-MM') = '2012-04'
) as table2
where table1.email = table2.email
这是不对的,但我觉得我可以使用一些 Postgres 的窗口函数。请记住,窗口函数不允许您指定 WHERE 子句。您主要可以访问前面的行和前面的行:
select month, count(*) as num_transactions, count(*) over (PARTITION BY month ORDER BY month)
from
(select distinct
to_char(transaction.timestamp, 'YYYY-MM') as month,
auth_user.email
from
auth_user,
transaction
where
auth_user.id = transaction.buyer_id
order by
month
) as transactions_by_month
group by
month