CTE (Common Table Expression) — именованный временный результат запроса, который можно использовать как таблицу внутри основного запроса. Делает сложные запросы читаемыми. Открыть тренажёр → https://sqllab.ru/practice WITH название AS (
SELECT ...
)
SELECT *
FROM название;
Без CTE: SELECT user_id, COUNT(*) AS orders_count
FROM (
SELECT user_id FROM orders WHERE status = 'completed'
) sub
GROUP BY user_id
HAVING COUNT(*) > 5;
С CTE: WITH completed_orders AS (
SELECT user_id
FROM orders
WHERE status = 'completed'
)
SELECT user_id, COUNT(*) AS orders_count
FROM completed_orders
GROUP BY user_id
HAVING COUNT(*) > 5;
Результат одинаковый, но CTE легче читать и отлаживать. WITH
-- Шаг 1: выручка по пользователям
user_revenue AS (
SELECT user_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY user_id
),
-- Шаг 2: перцентили
user_percentiles AS (
SELECT
user_id,
total,
NTILE(4) OVER (ORDER BY total DESC) AS quartile
FROM user_revenue
)
-- Финальный результат
SELECT quart