首页 > 解决方案 > 对数值列的前 1 个和后 1 个数值进行红移求和窗函数,即使这些值不存在

问题描述

我有一张关于 Redshift 的表格,如下所示:

维度 1、维度 2、Built_year(数字列)、Units_sold

对于维度 1、维度 2 的每个组合,我需要对built_year-1、当前built_year、built_year+1 的度量求和。

问题是,通过使用 SUM() 窗口函数,我完成了对 built_year 变量的上一行和下一行的度量求和,并且在许多情况下,上一行和下一行不是built_year-1,built_year+1,而是built_year- 3、built_year+2 等。所以不是所有的built_year 值都在变量built_year 中按顺序找到。

我的代码是:

with sold_per_cluster as 
(
select t2.dimension1 AS make,
       t3.dimension2 AS model, 
       t1.built_year AS built_year,
       count(distinct t1.id) as units_sold
       
from table1 t1
left join table2 t2 ON t2.code = t1.code   -- #
left join table3 t3  ON t3.id = t1.type_id   -- #
where 1 
and t1.paid_bool = 1
and t1.paid_datetime >= getdate() - interval '2 year'
group by 1,2,3
order by 1,2,3 asc


)

select make, model,built_year, 
       sum(units_sold) over (partition by make,model order by built_year
                            rows between 1 preceding and 1 following) as units_sold
from sold_per_cluster
group by 1,2,3, units_sold

即使它不存在,Redshift 有没有办法对 built_year 的 numeric_value +1、-1 进行求和?

标签: sqlamazon-redshiftwindow-functions

解决方案


“不”是您问题的答案。

您需要 UNION ALL 所有维度和年份的组合,units_sold 为 0 到您的数据,然后 SUM() units sold 以将零添加到当前数据集。(SUM() 可以在您的顶部选择中完成,因为窗口函数在 group by 和聚合函数之后运行。)这样您就可以在上一年和下一年为窗口函数进行操作。


推荐阅读