Вы хотите вывести по каждому пользователю orders_cnt и last_order_dt. Какой вариант обычно проще читать и расширять новыми метриками?
AДва коррелированных скалярных подзапроса в
SELECT: один считает COUNT(*), другой MAX(created_at) по той же таблице.BОдин подзапрос в
SELECT, который пытается вернуть сразу две колонки COUNT(*) и MAX(created_at) через одну запись.CСделать
WITH user_agg AS (SELECT user_id, COUNT(*), MAX(created_at) FROM orders GROUP BY user_id) и LEFT JOIN к users.DСделать выгрузку через
IN в WHERE, а счётчики и максимальную дату собрать уже после выгрузки в Python или Excel.Правильный ответ. Предагрегация в CTE делает уровни данных явными: одна строка на
user_id, дальше присоединение к users.Разбор
Несколько скалярных подзапросов в SELECT быстро превращаются в трудночитаемый набор «встроенных» расчётов и плохо расширяются. Если агрегировать факты в одном CTE, гранулярность фиксируется явно: одна строка на пользователя, и новые поля добавляются в одном месте без вложенности. Промежуточный CTE удобно проверить отдельно, что снижает риск ошибок. Постобработка в Python/Excel или вторая выгрузка с IN усложняют поддержку и неэффективны.
Проверь себя · 1/3разбор после ответа
В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период, причём шаг «оплаченные за период» используется ещё в трёх соседних метриках. Какой подход обычно делает запрос проверяемее и позволяет переиспользовать фильтрацию?
Ещё вопросы по теме «Подзапросы и 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` корректно использует коррелированный подзапрос?
- Дашборд содержит две метрики на одних и тех же продажах: топ товаров по выручке за период и общая выручка за тот же период. Витрина обновляется ежедневно, и важно, чтобы фильтр по периоду был один и тот же для обеих цифр. Какой подход надёжнее защищает от рассинхронизации?
- Все вопросы по «Подзапросы и CTE» →