Вы хотите вывести по каждому пользователю 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 усложняют поддержку и неэффективны.

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

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

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

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

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