В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период, причём шаг «оплаченные за период» используется ещё в трёх соседних метриках. Какой подход обычно делает запрос проверяемее и позволяет переиспользовать фильтрацию?

AОдин большой SELECT, в котором одинаковые условия по статусу и периоду повторяются в каждом подзапросе
BCTE через WITH paid_orders AS (...), а затем агрегация по странам и другим метрикам из этой CTE
CКоррелированный подзапрос в SELECT для каждой строки пользователя, считающий выручку отдельно
DНесколько вложенных IN-подзапросов вместо явного шага фильтрации, чтобы не писать JOIN
Правильный ответ. WITH (CTE) позволяет вынести общий шаг (например, фильтрацию оплаченных заказов) в именованный блок и использовать его дальше как таблицу.

Разбор

Когда один и тот же набор строк нужен нескольким частям запроса, CTE помогает избежать дублирования условий: фильтры пишутся один раз, а затем используются в финальном SELECT. Это повышает читаемость и снижает шанс, что фильтры «разъедутся» между метриками. Плюс промежуточный шаг легко проверить отдельно, выполнив CTE как самостоятельный запрос.

Проверь себя · 1/3разбор после ответа
Вы разбираете сложный отчёт коллеги: 4 уровня вложенных подзапросов в FROM без имён шагов. Решаете переписать через WITH. Какое практическое преимущество даёт CTE по сравнению с вложенными подзапросами?
Тренировать SQL в Telegram

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