Вы хотите вывести по каждому пользователю orders_cnt и last_order_dt. Какой вариант обычно проще читать и расширять новыми метриками?

AДва коррелированных подзапроса в SELECT: один с COUNT, другой с MAX.
BОдин подзапрос в SELECT, который возвращает сразу две колонки (COUNT и MAX).
CСделать CTE WITH user_agg AS (SELECT user_id, COUNT(*) AS orders_cnt, MAX(created_at) AS last_order_dt FROM orders GROUP BY user_id) и затем LEFT JOIN к users.
DИспользовать IN в WHERE, а счётчики посчитать уже после выгрузки данных.
Правильный ответ. Предагрегация в CTE делает уровни данных явными: одна строка на user_id, затем присоединение к users.

Разбор

Несколько скалярных подзапросов в SELECT быстро превращаются в трудночитаемый набор «встроенных» расчётов. Когда вы агрегируете факты в одном CTE, вы явно фиксируете гранулярность (1 строка на пользователя) и можете добавлять новые поля в одном месте, не размножая вложенность. Плюс промежуточный CTE удобно проверить отдельно.

Проверь себя · 1/3разбор после ответа
Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?
Тренировать SQL в Telegram

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