Допустим, у меня есть таблица «событий» таблицы BigQuery (на самом деле это медленный подзапрос), в которой хранится количество событий в день по типам событий. Существует много типов событий, и большинство из них не происходит в большинстве дней, поэтому есть только строка для комбинаций типа день / событие с ненулевым счетом.
У меня есть запрос, который возвращает счетчик для каждого типа события и дня и счетчик для этого события из N дней назад, который выглядит следующим образом:
WITH events AS (
SELECT DATE('2019-06-08') AS day, 'a' AS type, 1 AS count
UNION ALL SELECT '2019-06-09', 'a', 2
UNION ALL SELECT '2019-06-10', 'a', 3
UNION ALL SELECT '2019-06-07', 'b', 4
UNION ALL SELECT '2019-06-09', 'b', 5
)
SELECT e1.type, e1.day, e1.count, COALESCE(e2.count, 0) AS prev_count
FROM events e1
LEFT JOIN events e2 ON e1.type = e2.type AND e1.day = DATE_ADD(e2.day, INTERVAL 2 DAY) -- LEFT JOIN, because the event may not have occurred at all 2 days ago
ORDER BY 1, 2
Запрос медленный. Рекомендации BigQuery рекомендуют использовать оконные функции вместо самостоятельных объединений. Есть ли способ сделать это здесь? Я мог бы использовать функцию LAG
, если бы для каждого дня была строка, но ее нет. Могу ли я как-нибудь "дополнить"? (Нет краткого списка возможных типов событий. Конечно, я мог бы присоединиться к SELECT DISTINCT type FROM events
, но это, вероятно, не будет быстрее, чем само-присоединение.)