ある月から次の月までの保持を示す基本的な表を取得しようとしています。つまり、誰かが先月何かを購入し、翌月に購入した場合、それはカウントされます。
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