-- Template: Window Functions for Ranking
-- Pattern: Rank records within partitions
-- Use Case: Top N per category, rankings, row numbers

-- Example 1: Rank customers by total orders in each city
SELECT 
    customer_id,
    name,
    city,
    total_orders,
    ROW_NUMBER() OVER (PARTITION BY city ORDER BY total_orders DESC) as row_num,
    RANK() OVER (PARTITION BY city ORDER BY total_orders DESC) as rank,
    DENSE_RANK() OVER (PARTITION BY city ORDER BY total_orders DESC) as dense_rank
FROM (
    SELECT 
        c.customer_id,
        c.name,
        c.city,
        COUNT(o.order_id) as total_orders
    FROM customers c
    LEFT JOIN orders o ON c.customer_id = o.customer_id
    GROUP BY c.customer_id, c.name, c.city
) customer_metrics;

-- Example 2: Top 3 customers per city
SELECT *
FROM (
    SELECT 
        customer_id,
        name,
        city,
        total_orders,
        ROW_NUMBER() OVER (PARTITION BY city ORDER BY total_orders DESC) as rn
    FROM customer_metrics
) ranked
WHERE rn <= 3;

-- Key Concepts:
-- - ROW_NUMBER(): Unique sequential number (1,2,3,4...)
-- - RANK(): Same rank for ties, skips next rank (1,2,2,4...)
-- - DENSE_RANK(): Same rank for ties, no gaps (1,2,2,3...)
-- - PARTITION BY: Restart ranking within each group
-- - ORDER BY: Defines ranking order within partition