İlk baxışda elə gələ bilər ki, SQL-də məlumat analizi üçün hər şey var: GROUP BY, aggregate-lar, subquery-lər... Amma bu sadəcə başlanğıcdır. Səni pəncərə funksiyaları dünyasına salamlayıram — bu güclü alət sənə məlumatlarla sətir-sətir işləməyə imkan verir, bütün konteksti qoruyaraq.
Pəncərə funksiyaları sənə hesablama aparmağa imkan verir — cəm, orta, rank və s. — “pəncərə”dəki sətirlər üzrə, məlumatları qruplaşdırmadan. Yəni, adi aggregate funksiyalardan (SUM(), AVG(), COUNT()) fərqli olaraq, sən həm nəticəni, həm də detalları hər sətirdə əldə edirsən.
Təsəvvür elə, sifarişlər üzrə yığılan gəliri hesablamaq istəyirsən. GROUP BY ilə konkret sifarişləri itirərdin — sadəcə cəm qalardı. Amma pəncərə funksiyası ilə nəticəni hər sətirə əlavə edirsən, heç nə itmədən.
Pəncərə funksiyaları xüsusilə rahatdır, çünki məlumatları “öldürmür”: hər sətir yerində qalır, hesablama nəticələri isə sadəcə yeni sütunlara əlavə olunur. Bu, çətin analitik hesablama aparmağa imkan verir — subquery-lərsiz və ağır konstruktorlarsız — hər şey bir query-də həll olunur. Belə funksiyalar rank-lama, moving average və ya sətirlər arasında müqayisə üçün idealdır. Kod oxunaqlı qalır, nəticə isə dəqiq olur.
Bunlar nə vaxt xüsusilə faydalıdır:
- İşçilərin, satıcıların, məhsulların rank-lanması — kim hansı yerdədir.
- Zaman sıraları — nəsə günlər və ya həftələr üzrə necə dəyişib.
- Satış və maliyyə — hər addımda nə qədər yığılıb, hansı sifarişlər ortalamadan yuxarıdır, kim top-25%-dədir.
Pəncərə funksiyaları harada istifadə olunur
Hər bir sahədə, harada ki, kontekst vacibdir, təkcə yekun yox:
- satış hesabatları;
- müştəri davranışının analizi;
- kümülyativ metrikalarla qrafiklərin qurulması;
- məlumatların seqmentasiyası (məsələn, kvartillərə görə);
- sapmaların və trend-lərin hesablanması.
Bunlar — hər gün SQL ilə işləyən analitiklər üçün əsl tapıntıdır. Gəlin real həyatdan bir neçə nümunəyə baxaq, harada ki, pəncərə funksiyaları sənin xilaskarın ola bilər.
Nümunə 1: Məlumatların rank-lanması
Təsəvvür elə, səndə tələbələrin imtahan balları olan siyahı var. Hər tələbəyə sinifdəki yerini vermək istəyirsən. Pəncərə funksiyaları ilə bu çox asandır. Məsələn, RANK() və ya ROW_NUMBER() funksiyaları bu işdə kömək edəcək.
Nümunə 2: Zaman məlumatlarının analizi
Bəs şirkətin gəliri aylara görə necə dəyişib, onu öyrənmək lazımdırsa? Sənə gəlirin yığılan cəmi lazımdır. Müəyyən pəncərə ilə SUM() funksiyasını istifadə edərək, bu nəticəni asanlıqla əldə edə bilərsən.
Nümunə 3: Kvartillər və qruplara bölmə
Məlumatları bərabər qruplara bölmək (məsələn, gəlirə görə) və müştəriləri seqmentləşdirmək istəyirsən? Burada NTILE() funksiyası köməyə gəlir. Gəlin baxaq, hansı müştərilər top-25%-dədir, kim isə aşağıdadır.
Bu necə görünür?
Pəncərə funksiyası sadəcə nəticəni yekun məlumat dəstinə əlavə edir:
SELECT
student_id,
grade,
RANK() OVER (ORDER BY grade DESC) AS rank
FROM
students;
Burada hər tələbənin qiymətinə görə unikal rank-ı olan cədvəl alırıq.
Sadə analogiya
Təsəvvür elə, dostlarınla qaçışdasan. Hər kəs öz sürəti ilə qaçır, amma sən bilmək istəyirsən ki, indi yarışda hansı yerdəsən. GROUP BY kimi hamını saxlayıb liderlər cədvəli qurmaq əvəzinə, sadəcə ətrafındakı qaçanlara baxıb cari rank-ını müəyyən edirsən.
Bax, pəncərə funksiyası da budur: o, qaçışı dayandırmır, hamını qruplara bölmür — sadəcə əlavə məlumat verir, hərəkəti və detalları saxlayır. Hər kəs qaçmağa davam edir, amma artıq səndə əlavə analitika var — məsələn, neçə nəfər səndən öndədir, sənin tempin ortalama ilə necədir və s.
Ənənəvi yanaşmalara qarşı üstünlüklər
Klassik bir tapşırığa baxaq: satışçılara gəlirə görə rank vermək. İki yanaşma var:
Pəncərə funksiyaları olmadan. Əvvəlcə məlumatları sort etmək, sonra isə nömrələmək üçün subquery və ya hətta bir neçə subquery yazmalısan. Bu, təkcə uzun deyil, həm də oxunması çətindir.
Pəncərə funksiyaları ilə. Cəmi bir query, gözəl və başadüşülən sintaksis, nəticə isə dərhal hazırdır. Məsələn:
SELECT
seller_id,
revenue,
RANK() OVER (PARTITION BY region ORDER BY revenue DESC) AS rank_in_region
FROM
sales;
Bu query satıcıları regionlara bölür və gəlirə görə azalan sırada nömrələyir.
Real nümunə
İndi təsəvvür elə, sən analitiksən və satış məlumatlarını analiz edirsən. Sənə lazımdır:
- hər ay üçün ümumi gəlir,
- gəlirin əvvəlki ayla müqayisədə necə dəyişdiyini bilmək,
- regionları ümumi gəlirə görə rank-lamaq.
Bütün bunları pəncərə funksiyaları ilə, hətta bir query-də etmək olar. Amma bu artıq növbəti dərslərin mövzusudur.
İndi pəncərə funksiyaları barədə əsas biliklərlə silahlanıb, onların sintaksisinə keçməyə və ROW_NUMBER(), RANK(), DENSE_RANK() və NTILE() funksiyalarının gücünü görməyə hazırsan. Növbəti dərsə keçirik!
GO TO FULL VERSION