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ə.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION