Сброс скользящей суммы до 0 после достижения порога - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь вычислить промежуточную сумму и сбросить ее до 0 на основе 2 условий или, если достигнут предел.

Вот пример.

Table

Как и на картинке выше, мне нужно получить промежуточную сумму при соблюдении следующих условий:

  1. месячная скидка = 0 и месячный билет = 1

    Если одно из скидок = 1 и билетов = 0, следующее значение для промежуточного итога должно быть 0.

  2. running_total <50 </p>

    Если промежуточный итог> = 50, значение промежуточного итога должно начинаться со значения в той же строке.

Вот что я пытаюсь сделать сейчас:

Есть ли возможность сделать это в HIVE? Большое вам спасибо !!!

SELECT * ,
       SUM(tag_flg) OVER (PARTITION BY account, flg_sum
                      ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
       AS running_sum
FROM
  ( SELECT * ,
           SUM(CASE
                   WHEN tag_flg>=50 THEN value
                   ELSE tag_flg
               END) OVER (PARTITION BY account
                          ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
           AS flg_sum
   FROM
     ( SELECT * ,
              CASE
                  WHEN month_disc =0
                       AND month_ticket = 1 THEN value
                  ELSE 0
              END AS tag_flg
      FROM source_table) x) y

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Вот как мне удалось это сделать:

SELECT *,
       SUM(case when month_disc=1 OR month_ticket=0 then 0 else value end) OVER (PARTITION BY account, flg_sum, band_sum ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_sum
 FROM (
    SELECT *,
           FLOOR(SUM(case when month_disc=1 OR month_ticket=0 then 0 else value end) OVER (PARTITION BY account, flg_sum ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)/50.000001) as band_sum ---- create bands for running total
 FROM (
    SELECT *,
          SUM(tag_flg) OVER (PARTITION BY account ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS flg_sum
 FROM (
    SELECT *,
          CASE WHEN  (month_disc=1 OR month_ticket=0) THEN 1 ELSE 0 END AS tag_flg ---- flag to count when the value is reset due to one of the conditions
    FROM source_table) x ) y) z
0 голосов
/ 23 мая 2019

Имеют ли значение 40, 60 и 20, которые вообще не учитываются в вашем отчете? Как бы вы хотели, чтобы они учитывались, а затем добавлялась новая строка с общим количеством 0 для перезапуска?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...