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

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 (...) вы явно задаёте общий источник данных и используете его повторно, поэтому логика становится детерминированной и проверяемой. Скалярный подзапрос с дублированием фильтра хрупок, коррелированный подзапрос меняет смысл (фильтрует строки, а не считает долю), а перенос фильтра наружу разрывает контракт расчёта.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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