Греча в ручной клади и магия generate_series.

Мы хотим взять с собой в путешествие по максимуму, но всегда ли оно того стоит? Вряд ли кто-то забивает ручную кладь доверху пакетами с гречей, ведь ее можно купить в любом продуктовом магазине.

В работе с данными есть аналогичные ситуации, когда легче создать новые, чем тянуть тяжелый багаж из реальных таблиц. И помогает в этом функция generate_series. Где использовал ее я: 1 кейс — Баг «31 день в каждом месяце». В скрипте, который я оптимизировал (писал об этом в этом посте ), данные тянулись из реальных источников, но логика была недоделана, и календарь хромал, показывая даже в феврале 31 день. Что я сделал: использовал генерацию серий. Базе больше не нужно сканировать таблицы, искать данные и сортировать. Количество дней создается в момент выбора периода на ходу. Итог: снял нагрузку с базы и починил визуализацию в BI.

2 кейс — Склейка Плана и Факта. План выполнения чего-то там всех компаний на месяц лежит в справочнике с SCD2 (например, план 100 для ООО “ААА” актуален с 01.01.2025 по 11.01.2025), а фактические данные берутся из ежедневных отчетов, но их сдают не все компании. В BI же нужен план по всем компаниям и факты отчитавшихся. Решение: взял даты начала/конца периода действия плана из справочника и создал на эти диапазоны запись на каждый день. Часть кода: CROSS JOIN LATERAL generate_series(p.start_date, p.end_date, ‘1 day’::interval) AS gs(day) Теперь у меня в плане и фактах были данные на каждый день, и я смог их правильно склеить.

Иногда создать новое решение «на месте» гораздо дешевле и быстрее, чем адаптировать старый багаж под новые условия.

Связи: 📌 Сначала понять ЧТО, потом КАК, потом делать


В этом посте были ссылки, но мы их удалили по правилам Сетки