pivott table 有条件

pivott table with conditions

例如我有一个table

day        id    event
1999-01-01  1     buy
1999-01-05  2     return
2000-01-10  3     buy
2000-05-12  1     return

我需要创建一个如下所示的 table:

month     count_buy   count_return_from_last_year
1999      2            
2000      1           1

我想这可以通过 window 函数 + 自连接来解决

应该这样做:

WITH counts AS (
    SELECT
        to_char(date, 'YYYY-MM') AS month,
        count(*) filter (WHERE event = 'buy') AS count_buy,
        count(*) filter (WHERE event = 'return') AS count_return
    FROM data
    GROUP BY 1
)
SELECT
    month,
    count_buy,
    lag(count_return) OVER (ORDER BY month) AS count_return_from_last_month
FROM counts
ORDER BY month;

请注意,要使 lag 始终针对上个月,您需要对每个月进行计数。如果数据中存在漏洞,则滞后将选择前一个可用月份。要解决这个问题,您首先必须加入所有月份的系列:

WITH counts AS (
    SELECT
        to_char(month, 'YYYY-MM') AS month,
        count(*) filter (WHERE event = 'buy') AS count_buy,
        count(*) filter (WHERE event = 'return') AS count_return
    FROM generate_series('1999-01-01'::date, '1999-12-01'::date, '1 month') AS month
    LEFT JOIN data ON date_trunc('month', date) = month
    GROUP BY 1
)
SELECT
    month,
    count_buy,
    lag(count_return) OVER (ORDER BY month) AS count_return_from_last_month
FROM counts
ORDER BY month;