这将做:
with s as
(SELECT max(transactions_year)/3 series FROM portfolios_static
UNION ALL
SELECT max(transactions_year)/3 * 2 series FROM portfolios_static
UNION ALL
SELECT max(transactions_year) series FROM portfolios_static
),
s1 as
(SELECT generate_series(
max(transactions_year)/3,
max(transactions_year),
max(transactions_year)/3
) AS series
FROM portfolios_static
),
srn as
(SELECT series,
row_number() over (order by series) rn
from s),
prepost as
(select coalesce(pre.series,0) as pre,
post.series as post
from srn post
left join srn pre on pre.rn = post.rn-1)
select pp.post number_of_deals_or_less,
avg(profit_perc_year) average_profit,
count(*) number_of_users
from portfolios_static p INNER JOIN prepost pp
ON p.transactions_year > pp.pre AND p.transactions_year <= pp.post
GROUP by pp.post
order by pp.post;
顺便说一句,我不得不放弃 generate_series 并只使用普通的 UNION ALL,因为当最大值不能被 3 整除时,生成系列不会返回正确的 MAX() 值。例如,如果将srn
CTE 替换为
srn as
(SELECT series,
row_number() over (order by series) rn
from s1), -- use generate_series
您会注意到,在某些情况下,系列中的最后一个值会小于max(transactions_year)
SQL小提琴