Короткий ответ
Нужно сгенерировать полный календарь дат за нужный период (через generate_series в PostgreSQL или аналог в другом диалекте) и сделать LEFT JOIN к фактической таблице метрики — даты без соответствия и будут пропущенными днями.
Как это работает подробнее
Если в таблице просто нет строки за какой-то день (а не строка со значением 0), обычный SELECT DISTINCT date FROM table этот пропуск не покажет — нужен «эталонный» список всех ожидаемых дат, с которым можно сравнить.
Пример кода
example.sql
-- PostgreSQL
SELECT d.day
FROM generate_series('2024-04-01'::date, '2024-04-30'::date, '1 day') AS d(day)
LEFT JOIN mart.daily_dau m ON m.event_date = d.day
WHERE m.event_date IS NULL;Что использовать на практике
- На практике. Такую проверку стоит включать в мониторинг качества данных для любых ежедневных витрин — пропущенный день гораздо легче не заметить, чем аномальное значение, потому что на графике линия просто «перескакивает» через дыру, если инструмент визуализации не акцентирует на этом внимание.
- Проверка. если запрос вернул даты — нужно проверить логи пайплайна за эти дни на предмет сбоя загрузки, прежде чем интерпретировать их как «нулевую активность».
Подводные камни
- Частые ошибки. Путают «день отсутствует в таблице» с «в этот день метрика была равна нулю» — это разные ситуации с разным объяснением (технический сбой загрузки против реального отсутствия активности), и их нельзя анализировать одинаково.