sql - 对数值列的前 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 进行求和?
解决方案
“不”是您问题的答案。
您需要 UNION ALL 所有维度和年份的组合,units_sold 为 0 到您的数据,然后 SUM() units sold 以将零添加到当前数据集。(SUM() 可以在您的顶部选择中完成,因为窗口函数在 group by 和聚合函数之后运行。)这样您就可以在上一年和下一年为窗口函数进行操作。
推荐阅读
- php - Laravel 5.5 从 URL 中删除登录以打开登录页面
- python - 读取 CSV 文件时出现 UnicodeDecodeError
- java - 调用 SuperClass 中的服务,该服务的实现被注入到子类中
- android - 从 web 视图保存但未显示在图库中的图像
- laravel-5.6 - 为什么构造函数在 Laravel 5.6 中返回 null
- json - 访问必要的字段 json golang
- javascript - 如何重新渲染子组件?
- css - 如何在 Vue.js 中通过重启和状态反馈来控制 CSS 动画?
- java - 如何在kotlin中访问java类的静态变量?
- php - 发送表单时未使用AngularJS控制器