Код IT
← Каталог

Общие табличные выражения (CTE) — Примеры оправданного использования

Фрагмент из «Общие табличные выражения (CTE)»: Примеры оправданного использования.

SQL main.sql
-- Многоэтапная обработка данных
WITH исходные_транзакции AS (
    SELECT 
        transaction_id,
        account_id,
        amount,
        transaction_date,
        transaction_type
    FROM транзакции
    WHERE transaction_date >= CURRENT_DATE - INTERVAL '90 days'
    AND статус = 'завершена'
),
агрегация_по_счетам AS (
    SELECT 
        account_id,
        COUNT(*) AS transaction_count,
        SUM(amount) AS total_volume,
        AVG(amount) AS average_amount,
        MAX(transaction_date) AS last_activity
    FROM исходные_транзакции
    GROUP BY account_id
),
категоризация_активности AS (
    SELECT 
        account_id,
        transaction_count,
        total_volume,
        average_amount,
        last_activity,
        CASE 
            WHEN transaction_count > 50 THEN 'высокая'
            WHEN transaction_count > 20 THEN 'средняя'
            ELSE 'низкая'
        END AS activity_level
    FROM агрегация_по_счетам
)
SELECT 
    c.account_id,
    a.account_name,
    c.transaction_count,
    c.total_volume,
    c.average_amount,
    c.activity_level,
    c.last_activity
FROM категоризация_активности c
JOIN счета a ON c.account_id = a.account_id
WHERE c.activity_level = 'высокая'
ORDER BY c.total_volume DESC;
-- Многоэтапная обработка данных
WITH исходные_транзакции AS (
    SELECT 
        transaction_id,
        account_id,
        amount,
        transaction_date,
        transaction_type
    FROM транзакции
    WHERE transaction_date >= CURRENT_DATE - INTERVAL '90 days'
    AND статус = 'завершена'
),
агрегация_по_счетам AS (
    SELECT 
        account_id,
        COUNT(*) AS transaction_count,
        SUM(amount) AS total_volume,
        AVG(amount) AS average_amount,
        MAX(transaction_date) AS last_activity
    FROM исходные_транзакции
    GROUP BY account_id
),
категоризация_активности AS (
    SELECT 
        account_id,
        transaction_count,
        total_volume,
        average_amount,
        last_activity,
        CASE 
            WHEN transaction_count > 50 THEN 'высокая'
            WHEN transaction_count > 20 THEN 'средняя'
            ELSE 'низкая'
        END AS activity_level
    FROM агрегация_по_счетам
)
SELECT 
    c.account_id,
    a.account_name,
    c.transaction_count,
    c.total_volume,
    c.average_amount,
    c.activity_level,
    c.last_activity
FROM категоризация_активности c
JOIN счета a ON c.account_id = a.account_id
WHERE c.activity_level = 'высокая'
ORDER BY c.total_volume DESC;