Рассчитать промежуточную сумму с условием в BigQuery - PullRequest
1 голос
/ 28 марта 2020

Извините, плохая тема ... Мне нужно вычислить промежуточную сумму, но мне нужно сбросить сумму по условию (когда ожидаемое значение достигло = 0). У меня есть эта таблица:

Date, Registrations, Expected Registrations, Expected reached
        2020-03-01, 5, 4,1
        2020-03-02, 7, 5,1
        2020-03-03, 8, 6,1
        2020-03-04, 2, 5,0
        2020-03-05, 5, 4,1
        2020-03-06, 7, 5,1
        2020-03-07, 8, 6,1
        2020-03-08, 2, 5,0

Ожидаемый результат с промежуточным итогом - условие состоит в том, что при «Ожидаемом достижении» <> 0 промежуточный итог должен быть рассчитан. Если «Ожидаемое достижение» = 0, промежуточный итог должен начинаться с 0:

Date, Registrations, Expected Registrations, Expected Reached, Running Total
            2020-03-01, 5, 4,1, 1
            2020-03-02, 7, 5,1, 2
            2020-03-03, 8, 6,1, 3
            2020-03-04, 2, 5,0, 0
            2020-03-05, 5, 4,1, 1
            2020-03-06, 7, 5,1, 2
            2020-03-07, 8, 6,1, 3 
            2020-03-08, 2, 5,0, 0

Я не знаю, как разделить мою оконную функцию, чтобы сделать это. Может быть, мне нужно создать промежуточный расчет раньше, но я не уверен. Есть предложения?

Редактировать: edit2: убрал мой "вопрос на лету".

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * EXCEPT(grp), 
  SUM(Expected_reached) OVER(PARTITION BY grp ORDER BY `date`) Running_Total
FROM (
  SELECT *, COUNTIF(Expected_reached = 0) OVER(ORDER BY `date`) grp 
  FROM `project.dataset.table`
)
0 голосов
/ 28 марта 2020

Используйте совокупную сумму, чтобы определить «острова». Тогда используйте row_number():

select t.*,
       (case when expected_reached > 0
             then row_number() over (partition by grp, (expected_reached = 0) 
                                     order by date
                                    )
             else 0
        end) as running_total
from (select t.*,
             countif(expected_reached = 0) over (order by date) as grp
      from t
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...