1.4Kпросмотров
93.7%от подписчиков
14 января 2026 г.
questionScore: 1.5K
Развилка в SQL: WHERE или агрегация с CASE? Есть таблица с событиями/заказами, где есть: ⭕️dt — string в формате YYYY-MM-DD (и ещё это partition key) ⭕️product — название продукта, иногда бывает 'unknown' Нужно по месяцам посчитать, сколько раз встречался unknown продукт. И тут два логичных решения — но они дают разный результат. Вариант 1 — вывести все месяцы и посчитать unknown (включая месяцы, где unknown = 0) select substr(dt, 1, 7) as ym, sum(case when product = 'unknown' then 1 else 0 end) as unknown_cnt from events where dt >= '2025-01-01' and dt < '2026-01-01' group by 1 order by 1; Ты увидишь все месяцы, которые есть в данных, и в них unknown_cnt будет 0, если unknown не встречался. Чаще всего для бизнеса это и есть верный вариант. Вариант 2 — отфильтровать unknown в WHERE (и потом агрегировать) select substr(dt, 1, 7) as ym, count(*) as unknown_cnt from events where product = 'unknown' and dt >= '2025-01-01' and dt < '2026-01-01' group by 1 order by 1; Но тут аккуратно - если в данных нет ни одной строки с unknown за период — запрос вернёт 0 строк. А потом вопрос к тебе "А где месяцы?" Что выбрать? 🔴Если нужны месяцы + нули → Вариант 1 (CASE внутри SUM/COUNT) 🔴Если нужны только месяцы, где unknown реально был → Вариант 2 (WHERE) ⚠️ Если dt — partition column и он string YYYY-MM-DD, то для фильтра по диапазону лучше не оборачивать dt в функции. Какой вариант вы бы выбрали по умолчанию в рабочем отчёте? 🔥 — A (месяцы + нули) 👍 — B (только где unknown был) Кстати, на неделю включил скидку на мои SQL-курсы (в закрепе). Если хочется больше практики — присоединяйся.
1.4K
просмотров
1680
символов
Нет
эмодзи
Нет
медиа

Другие посты @kuzmin_dmitry91

Все посты канала →
Развилка в SQL: WHERE или агрегация с CASE? Есть таблица с с — @kuzmin_dmitry91 | PostSniper