【问题标题】:Redshift running sum红移运行总和
【发布时间】:2021-01-27 23:53:47
【问题描述】:

我在 redshift 运行总和功能中遇到问题。这是我的设置。

表格

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),第二个月它只是说我增加或减少的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 Cal Month sum_hc running_hc
2021 1 75 75
2021 2 10 40

它不计算第 2 个月不存在的部门 ID。

但是,我实际上是在寻找下面的输出。

Cal_year Cal Month sum_hc running_hc
2021 1 75 75
2021 2 10 85

第 1 个月出现的 depat_id 很少,但在第 2 个月不出现。因此,它们不会被添加到第 2 个月的运行总和中。我正在寻找当月的 hc,方法是将所有上述月份的部门添加到运行总和中,并且还能够在特定月份向下钻取。

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift window-functions


    【解决方案1】:

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

    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;
    

    我认为使用中间表没有任何好处。

    Here 是一个 dbfiddle(恰好使用 Postgres,但这都是标准 SQL)。

    【讨论】:

    • 感谢您的回复。当我只需要聚合表时,这将起作用。最终目的是在报告级别也具有向下钻取功能。所以,我需要跟踪每个月的部门 ID 是如何增加的。并且每个月总的HC部门是明智的。所以,在这种情况下,我在第一个月有部门 id,但是当我从报告中向下钻取时,我应该能够在第二个月看到,这些 hc 来自部门 - 111,222,333 等。
    • @PallavPatel。 . .您可以为此目的使用另一个查询或表。
    • 我没有收到您的评论。另一个查询或表。您的意思是开发 ETL 流程并维护一个单独的表?如果我的理解是正确的,那么我们将在那里遇到同样的问题,因为按功能分区无法结转缺失值。如果我的理解不正确,请纠正我。
    • @PallavPatel。 . .其实我没看懂你的评论。这个问题显然是关于 aggregated 数据的,它返回问题中描述的值,如 SQL Fiddle 所示。如果您有其他问题,请提出 新 问题。这个问题已经回答了。
    【解决方案2】:

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

    1. 获取不同的部门 ID 并存储在临时表中
    2. 在每个月为缺少 hc 0 的部门 ID 添加虚假或虚拟条目。
    3. 窗口函数查询可以正常工作。

    这种方法效果很好,我可以继续进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多