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;
例如我有一个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;