我在红移运行和功能中面临问题。这是我的设置。
表
create table test
( cal_year varchar(30),
cal_month varchar(30),
dept_id varchar(50),
hc int
);
假值:
insert into qs.patpall_test values( 2021, 1 , 111, 50);
insert into qs.patpall_test values( 2021,1 , 222, 30);
insert into qs.patpall_test values( 2021,1 , 333, -5);
insert into qs.patpall_test values(2021, 2 , 222, 10);
基本上,第一个月,它是人数(hc),第二个月,它只是说我的人数增加或减少。
现在,我需要每年,每月和部门的运行金额。下面是相应的代码:
drop table if EXISTS a;
create temp table a as
select cal_year, cal_month, dept_id, sum_hc,
sum(sum_hc) over (PARTITION BY cal_year ,dept_id
ORDER BY cal_month rows unbounded preceding ) as running_hc
from (
select cal_year, cal_month, dept_id,
sum(hc) sum_hc
from qs.patpall_test
group by 1,2,3
);
如果我在聚合级别检查上述查询的输出。它给我错误的结果。
select cal_year, cal_month, sum(sum_hc), sum(running_hc)
from a
group by 1,2
这是我得到的输出。
<表类>Cal_year 卡尔月 sum_hc running_hc tbody><<tr>2021 1 75 75 2021 2 10 40 表类>
我建议直接对原始表运行代码:
select cal_year, cal_month, sum(hc) as this_month_hc,
sum(sum(hc)) over (order by cal_year, cal_month
rows unbounded preceding
) as running_hc
from qs.patpall_test
group by 1, 2;
我看不出使用中间表有什么好处。
这是一个数据库<>小提琴(碰巧使用Postgres,但这是所有标准的SQL)。
经过长时间的研究,窗口函数似乎无法处理这种类型的数据集。我可以用下面的步骤解决这个问题。
- 获取不同的部门id并存储在临时表
- 每个月为缺失的部门Id添加假或假条目,hh0
- 窗口函数查询可以正常工作
这个方法工作得很好,我可以继续下一步了。