İ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
GO TO FULL VERSION