SQL для расчета накопленной суммы, которая сбрасывается на основе предыдущего значения в столбце в Hive - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь создать кумулятивное значение с чем-то вроде этого

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

Итак, проблема в том, чтобы продолжать добавлять значение на 1 в столбце CUMU_VAL2 на основе предыдущей строки в VAL1, ноэта сумма сбрасывается, когда предыдущее значение в столбце 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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Моя поправка к ответу @ 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;
0 голосов
/ 25 сентября 2018

Вы можете назначить группу - это сумма 0s после данной строки.Затем используйте 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().

...