Нужно посчитать долю выручки каждого товара от общей выручки за один и тот же период. Какой вариант делает расчёт прозрачнее и избегает дублирования фильтра по периоду?

AВо внешнем SELECT с GROUP BY product_id посчитать SUM(amount) по товару, а общий SUM(amount) взять скалярным подзапросом, повторив WHERE date BETWEEN ... дважды
BСделать базовый WITH base AS (...) с фильтром по периоду, посчитать total и per_product из base, и в финальном SELECT делить per_product.product_amt на total.total_amt
CВ WHERE использовать коррелированный подзапрос со ссылкой на outer.product_id, чтобы оставить только товары с высокой долей и не считать SUM(amount) отдельно
DУбрать WHERE date BETWEEN ... из основного SELECT и применить фильтр по периоду уже после выгрузки в pandas, переложив согласованность на пользователя
Правильный ответ. Базовый CTE помогает один раз зафиксировать период и правила отбора, а затем строить от него и числитель, и знаменатель.

Разбор

Доля — это отношение двух агрегатов, которые должны быть рассчитаны на одном и том же наборе строк. Если фильтр копируется в два места, легко ошибиться (период или условия различатся) и получить неконсистентную метрику. При подходе с WITH base AS (...) вы явно задаёте общий источник данных и используете его повторно, поэтому логика становится детерминированной и проверяемой. Скалярный подзапрос с дублированием фильтра хрупок, коррелированный подзапрос меняет смысл (фильтрует строки, а не считает долю), а перенос фильтра наружу разрывает контракт расчёта.

Проверь себя · 1/3разбор после ответа
В одном отчёте вы считаете несколько метрик по событиям: dau, wau и число покупок. У всех метрик один и тот же фильтр: только продакшн-трафик и только выбранный период. Какой подход лучше защищает от ситуации, когда в одной метрике забыли часть фильтра?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»