Я решил эту проблему, загрузив все данные и перебрав их в Python, но мне интересно, есть ли способ сделать это в BigQuery.
У нас есть таблица с датами начала и окончания:
begin_date, end_date
'2016-02-19', '2016-02-19'
'2016-02-20', '2016-02-25'
'2016-02-21', '2016-02-25'
'2016-02-22', NULL
Нам нужно количество строк для каждой даты, где begin_date <= date <= end_date. Для любого заданного значения c достаточно просто выбрать счет: </p>
SELECT COUNT(*) FROM `table` WHERE begin_date <= '2016-12-19' AND (end_date >= '2016-12-19' OR end_date IS NULL)
Так что, если я сделаю это вручную для каждого интересующего меня значения, желаемый результат может выглядеть следующим образом:
begin_date, count
2016-02-19, 1
2016-02-20, 1
2016-02-21, 2
2016-02-22, 3
2016-02-23, 3
2016-02-24, 3
2016-02-25, 3
2016-02-26, 1
etc.
Достаточно просто создать список дат для перебора:
WITH dates AS (SELECT * FROM UNNEST(GENERATE_DATE_ARRAY('2018-10-01', '2020-09-30', INTERVAL 1 DAY)) AS example)
Теперь я борюсь с применением приведенного выше предложения WHERE для всех этих дат. Я вижу, как работает раздел с диапазоном при сопоставлении с одним столбцом ( как здесь ), но мне нужно сопоставить как begin_date, так и end_date.
Я думал, что смогу сделать это с это:
SELECT
status_begin_date,
(SELECT COUNT(1) FROM UNNEST(ends) AS e WHERE (e >= status_begin_date OR e IS NULL)) AS cnt
FROM (
SELECT
status_begin_date,
ARRAY_AGG(status_end_date) OVER(ORDER BY status_begin_date) AS ends
FROM `table`
)
ORDER BY status_begin_date
Взято из здесь . Это работает на небольшом примере, приведенном в ответе StackOverflow, но я получаю ошибку ресурса при использовании его в моей таблице с несколькими сотнями миллионов строк: Существует ли масштабируемое решение в BigQuery?