SUM цикл в BigQuery - PullRequest
       3

SUM цикл в BigQuery

0 голосов
/ 24 ноября 2018

Возможно ли такое агрегирование в BigQuery?У меня есть два поля - datetime и value (float64).Каждые 10 минут в таблице публикуется одно значение:

-----------------------------------
| datetime              | value   |
-----------------------------------
| 2018-11-01T09:00:05   | 1.1     |
| 2018-11-01T09:10:01   | 1.2     |
| 2018-11-01T09:20:59   | 2.4     |
| 2018-11-01T09:30:18   | 0.8     |
| ...                   | ...     |
| 2018-11-21T22:50:04   | 2.1     |
| ...                   | ...     |
| 2018-11-30T23:59:59   | 4.2     |
-----------------------------------

Есть ли способ получить агрегированную таблицу с датой и суммой всех предыдущих значений от начала до конкретной даты?Например, за один месяц это будет 31 (или 30) рядов дат, а строка значений для каждого дня будет иметь сумму всех предыдущих значений:

-----------------------------------------------------------------------
| date                  | value                                       |
-----------------------------------------------------------------------
| 2018-11-01            | SUM of all values 2018-11-01...2018-11-01   |
| 2018-11-02            | SUM of all values 2018-11-01...2018-11-02   |
| 2018-11-03            | SUM of all values 2018-11-01...2018-11-03   |
| 2018-11-04            | SUM of all values 2018-11-01...2018-11-04   |
| ...                   | ...                                         |
| 2018-11-20            | SUM of all values 2018-11-01...2018-11-20   |
| ...                   | ...                                         |
| 2018-11-30            | SUM of all values 2018-11-01...2018-11-30   |
-----------------------------------------------------------------------

Ответы [ 2 ]

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

BigQuery CTE обычно помогают упростить понимание.Это должно работать в случае ваших datetime значений:

with datevals as (
  select date(datetime) as date, sum(value) as value from `dataset.table` group by 1
)
select a.date as dt, sum((select sum(b.value) from datevals b where b.date <= a.date )) as value
from datevals a
group by 1
order by 1
0 голосов
/ 25 ноября 2018

Ниже для стандартного SQL BigQuery - вы сначала группируете по дням и суммируете все значения за день, а затем применяете оконную функцию для получения окончательного результата

#standardSQL
SELECT 
  day, SUM(value) OVER(ORDER BY day) value
FROM (
  SELECT DATE(dt) day, SUM(value) value
  FROM `project.dataset.table`
  GROUP BY day
)

В случае, если вам необходимо выполнить «сброс»сумма каждый месяц - вы можете использовать ниже

#standardSQL
SELECT 
  day, SUM(value) OVER(PARTITION BY DATE_TRUNC(day, MONTH) ORDER BY day) value
FROM (
  SELECT DATE(dt) day, SUM(value) value
  FROM `project.dataset.table`
  GROUP BY day
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...