CodeGym /Kurslar /SQL SELF /Məlumatların təhlili üçün window funksiyalarının istifadə...

Məlumatların təhlili üçün window funksiyalarının istifadə nümunələri

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

İndi sən hazırsan ki, praktik nümunələrə baş vurasan və görəsən, bütün bu şeylər real tapşırıqlarda necə işləyir!

Nümunə: regionlar üzrə satışların rütbəsinin hesablanması

Təsəvvür elə ki, bizdə sales adlı bir cədvəl var və orda müxtəlif regionlarda satışlar barədə məlumatlar saxlanılır. Bizə hər region üçün satışların rütbəsini müəyyən etmək lazımdır.

id region sales_amount
1 North 5000
2 North 3000
3 North 7000
4 South 2000
5 South 4000
6 East 8000
7 East 6000

Tapşırıq: hər region üzrə satışların rütbəsini (RANK) tapmaq

SELECT
    region,
    sales_amount,
    RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS sales_rank
FROM 
    sales;

Nəticə:

region sales_amount sales_rank
North 7000 1
North 5000 2
North 3000 3
South 4000 1
South 2000 2
East 8000 1
East 6000 2

Diqqət elə, biz PARTITION BY region istifadə etdik ki, hər region üçün rütbəni ayrıca hesablayaq. Əgər PARTITION BY istifadə etməsəydik, rütbə bütün cədvəl üzrə qlobal şəkildə hesablanardı.

Nümunə: gəlirin kümülyativ cəminin hesablanması

İndi isə transactions cədvəlini işləyək və hər bir müştəri üçün gəlirin kümülyativ (yığılan) cəmini hesablayaq.

id customer_id purchase_date amount
1 101 2023-01-01 100
2 101 2023-01-03 50
3 102 2023-01-02 200
4 101 2023-01-05 150
5 102 2023-01-04 100

Tapşırıq: hər müştəri üçün kümülyativ cəmi hesablamaq

SELECT
    customer_id,
    purchase_date,
    amount,
    SUM(amount) OVER (PARTITION BY customer_id ORDER BY purchase_date) AS cumulative_sum
FROM 
    transactions;

Nəticə:

customer_id purchase_date amount cumulative_sum
101 2023-01-01 100 100
101 2023-01-03 50 150
101 2023-01-05 150 300
102 2023-01-02 200 200
102 2023-01-04 100 300

Burda əsas məqam — OVER() içində ORDER BY purchase_date istifadə etməkdir ki, kümülyativ cəm xronoloji ardıcıllıqla hesablansın.

Nümunə: məlumatların kvartillərə bölünməsi

Təsəvvür elə ki, bizdə students cədvəli var və orda adlar və test nəticələri göstərilib. Biz istəyirik ki, tələbələri nəticələrinə görə 4 qrupa bölək.

id name test_score
1 Alice 85
2 Bob 95
3 Charlie 75
4 Diana 88
5 Edward 65
6 Fiona 70

Tapşırıq: NTILE() istifadə edərək tələbələri 4 qrupa bölmək

SELECT
    name,
    test_score,
    NTILE(4) OVER (ORDER BY test_score DESC) AS quartile
FROM 
    students;

Sorğunun nəticəsi belə olacaq:

name test_score quartile
Bob 95 1
Diana 88 1
Alice 85 2
Charlie 75 3
Fiona 70 3
Edward 65 4

NTILE(4) məlumatları 4 qrupa bölür. Ən yüksək nəticə göstərən tələbələr birinci qrupa, ən aşağı nəticə göstərənlər isə sonuncu qrupa düşür.

Nümunə: zaman məlumatlarının analizi

site_visits cədvəlində saytın günlər üzrə ziyarət sayı saxlanılır. Bizə hər sayt üçün günlər arasında ziyarət fərqini hesablamaq lazımdır.

site_id visit_date visits
1 2023-01-01 100
1 2023-01-02 120
1 2023-01-03 110
2 2023-01-01 50
2 2023-01-02 60
2 2023-01-03 70

Bizim tapşırığımız — günlər arasında ziyarət fərqini hesablamaqdır

SELECT
    site_id,
    visit_date,
    visits,
    visits - LAG(visits) OVER (PARTITION BY site_id ORDER BY visit_date) AS visit_diff
FROM 
    site_visits;

Nəticə:

site_id visit_date visits visit_diff
1 2023-01-01 100 NULL
1 2023-01-02 120 20
1 2023-01-03 110 -10
2 2023-01-01 50 NULL
2 2023-01-02 60 10
2 2023-01-03 70 10

LAG() funksiyası əvvəlki sətrin dəyərini götürməyə imkan verir. Əgər əvvəlki sətr üçün məlumat yoxdursa, nəticə NULL olacaq. Bu barədə daha ətraflı növbəti dərslərdə öyrənəcəksən :P

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