SQL для расчета накопленной суммы, которая сбрасывается на основе предыдущего значения в столбце в Hive
Я пытаюсь создать совокупную стоимость с чем-то вроде этого
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 ответа
Моя поправка к ответу @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 после данной строки. Тогда используйте 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()
,