[英]Getting previous year aggregated values in column in SQL
我在 sale_date grain 有数据,我想将前两年的总销售数字与当前日期相对应。 我正在维护一个日期维度表,其中每个日历日都有前一年的日期。
我尝试的解决方案是在与日期维度连接的同时使用与主表的交叉连接。 但是由于表将来会增长,交叉连接会导致性能问题。 寻找一些改进建议
with date_dim as (
select '2022-08-25'::date as calendar_day,
'2021-08-01'::date as prev_yr_date,
'2020-07-01'::date as prev_two_yr_date
union all
select '2021-08-01'::date as calendar_day,
'2020-08-01'::date as prev_yr_date,
'2019-07-01'::date as prev_two_yr_date
union all
select '2020-07-01'::date as calendar_day,
'2019-08-01'::date as prev_yr_date,
'2018-07-01'::date as prev_two_yr_date
),
main_data as (
select '2022-08-25'::date as sale_date, 10 as sale
union all
select '2021-08-01'::date as sale_date, 20 as sale
union all
select '2020-07-01'::date as sale_date, 30 as sale
)
select a.sale_date,
sum(case when b.sale_date = d.calendar_day then b.sale else 0 end) as current_Sale,
sum(case when b.sale_date = d.prev_yr_date then b.sale else 0 end) as prev_yr_sale,
sum(case when b.sale_date = d.prev_two_yr_date then b.sale else 0 end) as prev_two_yr_sale
from main_data a
cross join main_data b
inner join date_dim d on a.sale_date = d.calendar_day
group by 1
输入数据:
Output 来自我的查询:
with date_dim as (
select '2022-08-25'::date as calendar_day,
'2021-08-01'::date as prev_yr_date,
'2020-07-01'::date as prev_two_yr_date
union all
select '2021-08-01'::date as calendar_day,
'2020-08-01'::date as prev_yr_date,
'2019-07-01'::date as prev_two_yr_date
union all
select '2020-07-01'::date as calendar_day,
'2019-08-01'::date as prev_yr_date,
'2018-07-01'::date as prev_two_yr_date
),
main_data as (
select '2022-08-25'::date as sale_date, 10 as sale
union all
select '2021-08-01'::date as sale_date, 20 as sale
union all
select '2020-07-01'::date as sale_date, 30 as sale
)
SELECT d.calendar_day,sum(case when a.sale_date = d.calendar_day then a.sale else 0 end) as current_Sale,
sum(case when a.sale_date = d.prev_yr_date then a.sale else 0 end) as prev_yr_sale,
sum(case when a.sale_date = d.prev_two_yr_date then a.sale else 0 end) as prev_two_yr_sale
from main_data a join date_dim d on a.sale_date=d.calendar_day or a.sale_date=d.prev_yr_date or a.sale_date=d.prev_two_yr_date
group by 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.