Итого с несколькими условиями в bigquery - PullRequest
1 голос
/ 29 марта 2020

Мне нужно вычислить промежуточную сумму, но мне нужно сбросить итоговую сумму по условию (когда ожидаемое значение достигнет 0, а группа продуктов и изменения продукта). Здесь можно получить помощь без двух дополнительных полей: Рассчитать промежуточную сумму с условием в BigQuery У меня есть эта таблица, и я могу использовать product_group и product в качестве целых чисел или строк, как показано ниже.

Date, Product_group, Product, Registrations, Expected Registrations, Expected Reached, Running Total
            2020-03-01,A, Bikes, 5, 4,1, 1
            2020-03-02,A, Bikes, 7, 5,1, 2
            2020-03-03,A, Bikes, 8, 6,1, 3
            2020-03-04,A, Bikes, 2, 5,0, 0
            2020-03-05,A, Bikes, 5, 4,1, 1
            2020-03-06,A, Bikes, 7, 5,1, 2 
            2020-03-04,B, Cars , 2, 5,0, 0
            2020-03-05,B, Cars , 5, 4,1, 1
            2020-03-06,B, Cars , 7, 5,1, 2
            2020-03-07,B, Cars , 8, 6,1, 3 
            2020-03-08,C, Plane, 2, 5,0, 0

Любые предложения, как адаптировать этот запрос (ответ из другого поста), который прекрасно работает без двух дополнительных полей:

#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`
)

Проблема в том, что COUNTIF(Expected_reached = 0) OVER(ORDER BY date ) grp начинается заново, когда изменяется product_group или product, и я получаю неуникальные группы, поэтому итоговая сумма SUM(Expected_reached) OVER(PARTITION BY grp ORDER BY date ) Running_Total не рассчитывается правильно.

Ответы [ 2 ]

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

Вам просто нужно добавить PARTITION BY Product_group, Product к обеим аналитикам c функциям

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

Что касается, вам просто нужно добавить два дополнительных столбца, product_group и product, к разделу раздела оконных функций:

select 
    * except(grp), 
    sum(expected_reached) 
        over(partition by grp, product_group, product order by `date`) running_total
from (
    select 
        *, 
        countif(expected_reached = 0) 
            over(partition by product_group, product order by `date`) grp 
    from `project.dataset.table` 
)
...