CodeGym /Kurslar /SQL SELF /Əsas pəncərə funksiyaları: ROW_NUMBER(), <...

Əsas pəncərə funksiyaları: ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE()

SQL SELF
Səviyyə , Dərs
Mövcuddur

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 (9587) 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ə.

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Sətirlərin nömrələnməsi `ROW_NUMBER` istifadə etməklə
Sətirlərin nömrələnməsi `ROW_NUMBER` istifadə etməklə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION