Keçən dərsdə başa düşdük ki, pəncərə funksiyaları nəyə lazımdır. İndi isə konkret funksiyalara və onların nəticələrinə baxaq. Sintaksisin detalları növbəti dərsdə olacaq.
ROW_NUMBER() funksiyası
ROW_NUMBER() funksiyası pəncərə daxilində hər sətrə unikal nömrə verir. Sadəcə olaraq, ORDER BY ilə müəyyən olunan qaydada sətirləri nömrələyir.
Sintaksis:
ROW_NUMBER() OVER ([PARTITION BY column] ORDER BY column)
Burada:
PARTITION BY column(istəyə bağlı): datanı qruplara bölür. Əgər yazmasan, nömrələmə bütün dataset üzrə olacaq.ORDER BY column: nömrələmə üçün sətirlərin sırasını təyin edir.
Nümunə. Cədvəldə sətirlərin nömrələnməsi
Gəlin students cədvəlinə baxaq, burada tələbələr və onların balları haqqında info var.
SELECT * FROM students;
| id | name | score |
|---|---|---|
| 1 | Eva Lang | 95 |
| 2 | Maria Chi | 87 |
| 3 | Alex Lin | 78 |
| 4 | Anna Song | 95 |
| 5 | Otto Mart | 87 |
İndi isə sətirləri balların azalan sırasına görə nömrələyək (score):
SELECT
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM students;
Nəticə:
| name | score | row_num |
|---|---|---|
| Eva Lang | 95 | 1 |
| Anna Song | 95 | 2 |
| Maria Chi | 87 | 3 |
| Otto Mart | 87 | 4 |
| Alex Lin | 78 | 5 |
Hər sətir unikal sıra nömrəsi aldı — balların azalan sırasına görə.
Bu çox sadə, amma güclü bir əməliyyatdır — sorğunun nəticəsinə sıra nömrəsi əlavə etmək. Klassik SELECT ilə bunu pəncərə funksiyaları olmadan etmək mümkün deyil.
RANK() funksiyası
RANK() funksiyası ROW_NUMBER() funksiyasına çox bənzəyir, amma eyni dəyərləri nəzərə alır. Əgər sətirlər sıralamada eyni dəyərə malikdirsə, onlar eyni rank alır, növbəti rank isə atlanır.
Sintaksis:
RANK() OVER ([PARTITION BY column] ORDER BY column)
Nümunə. Tələbələrin ballarına görə rank verilməsi
Gəlin RANK() funksiyasını eyni datada yoxlayaq:
SELECT
name,
score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM students;
Nəticə:
| name | score | rank |
|---|---|---|
| Eva Lang | 95 | 1 |
| Anna Song | 95 | 1 |
| Maria Chi | 87 | 3 |
| Otto Mart | 87 | 3 |
| Alex Lin | 78 | 5 |
Burada eyni dəyərlərə malik sətirlər (95 və 87) eyni rank aldı, növbəti rank isə atlanıb.
DENSE_RANK() funksiyası
DENSE_RANK() funksiyası RANK() funksiyasına bənzəyir, amma rank dəyərlərini atlamır. Yəni, təkrarlanan sətirlər varsa, növbəti rank əvvəlkindən bir vahid böyük olur.
Sintaksis:
DENSE_RANK() OVER ([PARTITION BY column] ORDER BY column)
Nümunə. Sıx rank verilməsi
Eyni datada DENSE_RANK() istifadə edək:
SELECT
name,
score,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
Nəticə:
| name | score | dense_rank |
|---|---|---|
| Eva Lang | 95 | 1 |
| Anna Song | 95 | 1 |
| Maria Chi | 87 | 2 |
| Otto Mart | 87 | 2 |
| Alex Lin | 78 | 3 |
Burada, RANK() funksiyasından fərqli olaraq, rank dəyərləri atlanmır, ardıcıl artır.
NTILE() funksiyası
NTILE() funksiyası sətirləri bərabər qruplara (kvantilərə) bölür və hər sətirə qrup nömrəsi verir.
Sintaksis:
NTILE(n) OVER ([PARTITION BY column] ORDER BY column)
n: datanı neçə qrupa bölmək istədiyini göstərir.
Nümunə. Tələbələri 3 qrupa bölmək
Gəlin tələbələri balların azalan sırasına görə 3 qrupa bölək:
SELECT
name,
score,
NTILE(3) OVER (ORDER BY score DESC) AS group_num
FROM students;
Nəticə:
| name | score | group_num |
|---|---|---|
| Eva Lang | 95 | 1 |
| Anna Song | 95 | 1 |
| Maria Chi | 87 | 2 |
| Otto Mart | 87 | 2 |
| Alex Lin | 78 | 3 |
Diqqət et: əgər sətirləri tam bərabər qruplara bölmək mümkün deyilsə, artıq sətirlər ilk qruplara düşür. Bu nümunədə ilk iki qrupda iki sətir, sonuncuda isə bir sətir var.
Hansını nə vaxt istifadə etməli?
ROW_NUMBER(): sıralama ilə unikal sətir nömrələməsi üçün.RANK(): eyni dəyərləri nəzərə alaraq və rank atlayaraq sıralama üçün.DENSE_RANK(): eyni dəyərləri nəzərə alaraq, rank atlamadan sıralama üçün.NTILE(): Sətirləri bərabər qruplara bölmək üçün.
Bütün bu funksiyalar datanı tam fərqli səviyyədə analiz etməyə kömək edir. Sıra nömrəsi hesablamaq və ya datanı bölmək lazımdırsa, rahatlıqla istifadə elə.
GO TO FULL VERSION