红移运行和



我在红移运行和功能中面临问题。这是我的设置。

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_hcrunning_hctbody><<tr>202117575202121040

我建议直接对原始表运行代码:

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)。

经过长时间的研究,窗口函数似乎无法处理这种类型的数据集。我可以用下面的步骤解决这个问题。

  1. 获取不同的部门id并存储在临时表
  2. 每个月为缺失的部门Id添加假或假条目,hh0
  3. 窗口函数查询可以正常工作

这个方法工作得很好,我可以继续下一步了。

相关内容

  • 没有找到相关文章

最新更新