CTE — это именованный подзапрос, который объявляется через WITH и делает сложные запросы читаемыми. Вместо вложенных подзапросов на три экрана ты выносишь каждый шаг в отдельный блок с понятным именем.
WITH active_users AS (
SELECT id FROM users WHERE status = 'active'
),
recent_orders AS (
SELECT user_id, COUNT(*) as cnt
FROM orders WHERE created_at > NOW() - INTERVAL '7 days'
GROUP BY user_id
)
SELECT * FROM active_users JOIN recent_orders ON ...
CTE бывают рекурсивными — для деревьев и графов. В PostgreSQL CTE по умолчанию может быть optimization fence (не инлайнится), но начиная с версии 12 планировщик стал умнее.