Window Functions

ROW_NUMBER, RANK, LAG, LEAD, kümülatif toplamlar

Window Functions Nedir?

Aggregate gibi hesaplama yapar ama satırları gruplamaz. Her satırda result set'in tamamına veya bir bölümüne erişir.

Temel Sözdizimi

fonksiyon() OVER (
    PARTITION BY bölümleme_kolonu  -- İsteğe bağlı
    ORDER BY sıralama_kolonu       -- İsteğe bağlı
    ROWS/RANGE frame              -- İsteğe bağlı
)

Sıralama Fonksiyonları

FonksiyonAçıklamaÖrnek
ROW_NUMBER()Benzersiz sıra (1,2,3,4)Sayfalama
RANK()Eşitlikte boşluk (1,2,2,4)Yarışma sıralaması
DENSE_RANK()Eşitlikte boşluk yok (1,2,2,3)Sıkı sıralama
NTILE(n)n gruba bölYüzdelik dilimler
SELECT 
    name,
    department,
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,
    RANK() OVER (ORDER BY salary DESC) AS rank,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,
    NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;
name | department | salary | row_num | rank | dense_rank | quartile --------+------------+--------+---------+------+------------+---------- Ali | IT | 25000 | 1 | 1 | 1 | 1 Mehmet | Sales | 20000 | 2 | 2 | 2 | 1 Ayşe | IT | 20000 | 3 | 2 | 2 | 2 Fatma | HR | 18000 | 4 | 4 | 3 | 2

PARTITION BY ile Gruplandırma

-- Her departmanda en yüksek maaşlı çalışan
SELECT * FROM (
    SELECT 
        name,
        department,
        salary,
        RANK() OVER (
            PARTITION BY department 
            ORDER BY salary DESC
        ) AS dept_rank
    FROM employees
) ranked
WHERE dept_rank = 1;

LAG ve LEAD

FonksiyonAçıklama
LAG(col, n, default)n satır önceki değer
LEAD(col, n, default)n satır sonraki değer
FIRST_VALUE(col)Penceredeki ilk değer
LAST_VALUE(col)Penceredeki son değer
-- Önceki aya göre satış karşılaştırması
SELECT 
    TO_CHAR(month, 'YYYY-MM') AS month,
    sales,
    LAG(sales, 1, 0) OVER (ORDER BY month) AS prev_month,
    sales - LAG(sales, 1, 0) OVER (ORDER BY month) AS diff,
    ROUND(
        (sales - LAG(sales, 1) OVER (ORDER BY month)) * 100.0 / 
        NULLIF(LAG(sales, 1) OVER (ORDER BY month), 0), 
    2) AS growth_pct
FROM monthly_sales
ORDER BY month;
month | sales | prev_month | diff | growth_pct ----------+----------+------------+----------+------------ 2024-01 | 45000.00 | 0.00 | 45000.00 | NULL 2024-02 | 52000.00 | 45000.00 | 7000.00 | 15.56 2024-03 | 48000.00 | 52000.00 | -4000.00 | -7.69

Kümülatif Toplam ve Ortalama

SELECT 
    date,
    amount,
    SUM(amount) OVER (ORDER BY date) AS running_total,
    ROUND(AVG(amount) OVER (ORDER BY date), 2) AS cumulative_avg,
    ROUND(AVG(amount) OVER (
        ORDER BY date 
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ), 2) AS moving_avg_7day
FROM daily_sales;

Frame Specification

-- Son 3 satırın ortalaması
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

-- Tüm önceki satırların toplamı
SUM(amount) OVER (ORDER BY date ROWS UNBOUNDED PRECEDING)

-- Önceki ve sonraki 1 satır dahil ortala
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)