Вы хотите вывести по каждому пользователю 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 корректно использует коррелированный подзапрос?Ещё вопросы по теме «Подзапросы и CTE»
- В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период. Какой подход обычно делает запрос более читаемым и позволяет переиспользовать шаг фильтрации?
- Вы выбираете пользователей, у которых есть хотя бы один платеж. В таблице `payments` поле `user_id` иногда бывает `NULL` (например, анонимные платежи). Почему в такой ситуации часто предпочитают `EXISTS`, а не `IN`?
- Вы пишете `SELECT u.user_id, (SELECT order_id FROM orders o WHERE o.user_id = u.user_id) AS last_order_id FROM users u`. Что может пойти не так и как исправить, чтобы подзапрос стал скалярным?
- Нужно выбрать заказы, у которых `amount` выше среднего `amount` по тому же пользователю. Какой вариант `WHERE` корректно использует коррелированный подзапрос?
- Вы готовите дашборд: нужно (1) топ товаров по выручке за период и (2) общая выручка за тот же период. Какой вариант снижает риск, что фильтр по периоду рассинхронизируется между расчётами?
- Все вопросы по «Подзапросы и CTE» →