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ı
| Fonksiyon | Açı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öl | Yü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
| Fonksiyon | Açı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)