【问题标题】:SQL to calculate cumulative sum that resets based on previous value in a column in HiveSQL 计算基于 Hive 列中先前值重置的累积总和
【发布时间】:2018-09-24 21:33:09
【问题描述】:

我正在尝试用这样的东西创建一个累积值

KEY1    Date_    VAL1    CUMU_VAL2
K1      D1      1       0
K1      D2      1       1
K1      D3      0       2
K1      D4      1       0
K1      D5      1       1

因此,问题基本上是在 VAL1 中的前一行的基础上继续在 CUMU_VAL2 列中将值加 1,但是当 VAL1 列中的前一个值为零时,此总和会重置。 基本上,如果你在 excel 中这样做,那么 Cell(D3) 的公式就是

  D3 = IF(C2>0, D2+1, 0)

我相信我应该能够做到这样,但是当先前的值为零时如何添加案例然后重置总和?

SELECT
   a1.*,
       SUM(a1.VAL1) OVER (PARTITION BY a1.KEY1 ORDER  BY a1.Date_ ) AS CUMU_VAL2
FROM source_table a1

【问题讨论】:

    标签: sql hive partition-by


    【解决方案1】:

    作为 OP,我对 @GordonLinoff 的回答的修改不太明白我的意思。

    SELECT
      t.KEY1, t.Date_, t.VAL1,
      ROW_NUMBER() OVER (PARTITION BY key1, grp
                             ORDER BY Date_
                        )
                        - 1
                             AS CUMU_VAL2
    FROM
    (
      SELECT
        *,
        SUM(
          CASE WHEN val1 = 0 THEN 1 ELSE 0 END
        )
        OVER (
          PARTITION BY key1
              ORDER BY date_
        )
          AS grp
      FROM
        source_table
    )
      t;
    

    【讨论】:

    • 我做了一个-2而不是-1,这样连续字段的计数就可以按照我想要的方式显示。如果前面的 val2 字段为 0,这将导致 cum_val2 显示“-1”而不是“0”,这很好!谢谢!
    【解决方案2】:

    您可以分配一个组——这是给定行之后 0 的总和。然后使用count():

    select t.KEY1, t.Date_, t.VAL1,
           count(*) over (partition by key1, grp, (case when val1 = 0 then 0 else 1 end)
                          order by date_
                         ) as cume_val1
    from (select t.*,
                 sum(case when a.val1 = 0 then 1 else 0 end) over (partition by key1 order by date_ rows between 1 following and unbounded following) as grp
          from source_table t
         ) t;
    

    如果 val1 只取值 0 和 1,则使用 row_number() 而不是 count()

    【讨论】:

    • @MatBailie 。 . .接得好。谢谢。
    • 当你在做a.val1 = 0 then 0时的情况时,它是从前一行获取值吗?只有当上一行的 Val1 为 0 时,累积值才变为 0
    • 我认为case when a.val1 = 0 then 0 不正确。在 op 的示例中,cum_val2 始终递增 1 (keep on adding the value by 1),包括 0 行。我认为一个简单的ROW_NUMBER() OVER (PARTITION BY key, grp ORDER BY Date_) - 1 是正确的。
    • @MatBailie - 如果 a1.val1 滞后 1 天 = 0,则总和应重置,我不确定将其放入查询中的最佳方法。
    • @yabtzey 。 . .我现在明白了。组的定义已关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多