T-SQL. Statistic (Aggregate) pəncərə (Window) funksiyaları

Salam Dostlar!

Bugünkü məqalədə pəncərə (Window) funksiyaları barədə mövzumuzu davam edəcəyik. Bu gün Statistik (Aggregate) pəncərə funksiyaları barədə danışacağıq.

Adi Statistic (Aggregate) funksiyaları: SUM(), AVG(), MIN(), MAX() və COUNT() pəncərə (Window) funksiyaları ola bilər. İlkin təyinetməyə görə (default) PARTITION BY həmişə tətbiq olunur. Əgər PARTITION BY təyin edilməyibsə FROM sorğusunun nəticəsi bütöv bir qrup kimi qəbul edilir. Bu statistik funksiyalar üçün ORDER BY şərtinin istifadəsi mənasızdır. Biz riyaziyyatdan bilirik ki, cəmin nəticəsi verilənlərin sırasından asılı deyildir.  

Nümunə üzərində baxaq:

TempDb bazasında işçilərin əmək haqları barədə məlumat saxlanılan yeni bir cədvəl yaradaq:

--Example Table: 
USE tempdb;
GO

DROP TABLE IF EXISTS dbo.HR_Assignments;
GO

CREATE TABLE HR_Assignments
(
Id int primary key,
FirstName nvarchar(50),
Department nvarchar(25),
Salary int
);
GO

INSERT INTO HR_Assignments
VALUES
(1, N'Elşən', 'Finance', 2000),
(2, N'Ramin', 'Finance', 1500),
(3, N'Hikmət', 'Finance', 2500),
(4, N'Sara', 'HR', 3000),
(5, N'Elçin', 'Finance', 3500),
(6, N'Fidan', 'HR', 2000),
(7, N'Ramin', 'Finance', 6500),
(8, N'Nigar', 'HR', 7000),
(9, N'Orxan', 'Finance', 2500),
(10, N'Rauf', 'Finance', 2000);
GO

Yaratdığımız cədvəldən bütün məlumatı alaq:

SELECT *
FROM HR_Assignments 

Hər bir departamentdə çalışan işçilərin sayını, həmçinin hər bir departament üzrə orta, ən yüksək və ən aşağı əmək haqqıarı barədə məlumat alaq. Bunun üçün adi qruplaşdırma funksiyalarından istifadə edə bilərik:

SELECT Department, 
COUNT(*) AS Total_Dept_Employee, 
AVG(Salary) AS AvgSal, 
MIN(Salary) AS MinSal, 
MAX(Salary) AS MaxSal
FROM HR_Assignments
GROUP BY Department

Lakin hesabatı bu cür verdikdə rəhbərlik tərəfindən bizə irad bildirilir ki, niyə təqdim etdiyiniz cədvəldə işçilərin adları və onların əmək haqları göstərilməyib? Qruplaşdırma funksiyasına FirstName və Salary sütunları əlavə etsək səhv mesajı alırıq:

SELECT FirstName, Department, Salary, 
COUNT(*) AS Total_Dept_Employee, 
AVG(Salary) AS AvgSal, 
MIN(Salary) AS MinSal, 
MAX(Salary) AS MaxSal
FROM HR_Assignments
GROUP BY Department

Bu mesajda deyilir ki, əlavə etdiyimiz sütunlar nə aqreqat funksiyasında, nə də ki GROUP BY şərtində mövcud deyil. Məhz bu zaman bizim köməyimizə pəncərə (Window) funksiyaları gəlir. Pəncərə (Window) funksiyaları qruplaşdırma funksiyalarından onunla fərqlənir ki, bu funksiyalarla bərabər sorğuda istənilən qədər sütundan istifadə edə bilərik:

SELECT FirstName, Department, Salary, 
COUNT(Department) OVER(PARTITION BY Department) AS Total_Dept_Employee, 
AVG(Salary) OVER(PARTITION BY Department) AS AvgSal, 
MIN(Salary) OVER(PARTITION BY Department) AS MinSal, 
MAX(Salary) OVER(PARTITION BY Department) AS MaxSal
FROM HR_Assignments

Pəncərə funksiyaları bölməyə (partition) daxil olan sətirlərlə işləmək imkanını verir. Məsələn belə bir sorğuya baxaq. Bu sorğuda Departament sütunu üzrə bölmələr təyin edilir və bu bölmələrə daxil olan və Salary sütunu üzrə sıralanmış hər bir sətir, ondan əvvəl gələn sətir və cari sətirdən sonra gələn sətirlərin sayı toplanılır:

SELECT FirstName, Department, Salary, 
COUNT(Department) 
OVER(PARTITION BY Department ORDER BY Salary ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS Total_Dept_Employee
FROM HR_Assignments

ROWS və RANGE şərtləri ilə təyin edilən fraqmentlər üçün ORDER BY operatorundan istifadə olunur.

Beləliklə, bugünkü məqalənin də sonuna gəlib çatdıq. Statistik pəncərə (Window) funksiyaları ilə tanış olduq. Növbəti məqalələrdə Pəncərə (Window) funksiyalarının digər kateqoriyası barədə ətraflı danışacağıq.

Növbəti məqalələrdə görüşənədək.

Diqqətinizə görə təşəkkür edirəm.

Səs: +30. Bəyənilsin Zəifdir

Müəllif: Rauf Khalafov

Şərhlər ( 1 )

  1. Təşəkkürlər, müəllim.

Şərh yazın