Bài viết này nói về các hàm Window T-SQL (Transact-SQL) và cách sử dụng cơ bản của chúng trong các tác vụ phân tích dữ liệu hàng ngày.
Có nhiều lựa chọn thay thế cho T-SQL khi nói đến phân tích dữ liệu. Tuy nhiên, khi các cải tiến theo thời gian và việc giới thiệu các chức năng của Window được xem xét, T-SQL có khả năng thực hiện phân tích dữ liệu ở mức cơ bản và trong một số trường hợp, thậm chí còn xa hơn thế.
Giới thiệu về các chức năng của cửa sổ SQL
Trước tiên, trước tiên chúng ta hãy làm quen với các hàm SQL Window trong ngữ cảnh của tài liệu Microsoft.
Định nghĩa Microsoft
Hàm cửa sổ tính giá trị cho mỗi hàng trong cửa sổ.
Định nghĩa đơn giản
Hàm cửa sổ giúp chúng tôi tập trung vào một phần (cửa sổ) cụ thể của tập kết quả để chúng tôi có thể thực hiện phân tích dữ liệu chỉ trên phần (cửa sổ) cụ thể đó, thay vì trên toàn bộ tập kết quả.
Nói cách khác, các hàm cửa sổ SQL biến một tập hợp kết quả thành nhiều tập hợp nhỏ hơn cho mục đích phân tích dữ liệu.
Tập hợp kết quả là gì
Nói một cách đơn giản, tập kết quả bao gồm tất cả các bản ghi được truy xuất bằng cách chạy truy vấn SQL.
Ví dụ:chúng ta có thể tạo một bảng có tên là Sản phẩm và chèn dữ liệu sau vào đó:
- (1) Tạo bảng Sản phẩm BẢNG ĐIỀU KHIỂN [dbo]. [Sản phẩm] ([ProductId] INT NOT NULL PRIMARY KEY, [Name] VARCHAR (40) NOT NULL, [Region] VARCHAR (40) NOT NULL) - (2) Điền vào bảng Sản phẩm CHÈN VÀO Sản phẩm (ProductId, Tên, Khu vực) GIÁ TRỊ (1, 'Máy tính xách tay', 'Vương quốc Anh'), (2, 'PC', 'UAE'), (3, 'iPad', 'Vương quốc Anh')
Bây giờ, tập kết quả được truy xuất bằng cách sử dụng tập lệnh bên dưới sẽ chứa tất cả các hàng từ Sản phẩm bảng:
- (3) Tập hợp kết quảSELECT [ProductId], [Tên], [Vùng] TỪ Sản phẩm
Cửa sổ là gì
Điều quan trọng đầu tiên là phải hiểu khái niệm về một cửa sổ vì nó liên quan đến các chức năng của cửa sổ SQL. Trong ngữ cảnh này, cửa sổ chỉ là một cách thu hẹp phạm vi của bạn bằng cách nhắm mục tiêu một phần cụ thể của tập kết quả (như chúng tôi đã đề cập ở trên).
Bạn có thể tự hỏi bây giờ - "nhắm mục tiêu một phần cụ thể của tập hợp kết quả" thực sự có nghĩa là gì?
Quay trở lại ví dụ mà chúng ta đã xem xét, chúng ta có thể tạo một cửa sổ SQL dựa trên vùng sản phẩm bằng cách chia tập hợp kết quả thành hai cửa sổ.
Hiểu Row_Number ()
Để tiếp tục, chúng tôi sẽ cần sử dụng hàm Row_Number () tạm thời cung cấp một số thứ tự cho các hàng đầu ra.
Ví dụ:nếu chúng tôi muốn thêm một số hàng vào tập hợp kết quả dựa trên ProductID, chúng tôi sẽ cần sử dụng ROW_NUMBER () để đặt hàng theo ID sản phẩm như sau:
--Sử dụng hàm row_number () để sắp xếp kết quả theo ProductIDSELECT ProductID, ROW_NUMBER () HẾT (ORDER BY ProductID) AS SrNo, Name, Region FROM Product
Bây giờ, nếu chúng ta muốn hàm Row_Number () để sắp xếp kết quả được đặt bởi ProductID giảm dần, sau đó là chuỗi các hàng đầu ra dựa trên ProductID sẽ thay đổi như sau:
- Sử dụng hàm row_number () để sắp xếp kết quả được đặt theo ProductID giảm dần
Chưa có cửa sổ SQL nào vì điều duy nhất chúng tôi đã làm là sắp xếp bộ theo tiêu chí cụ thể. Như đã thảo luận trước đó, windowing có nghĩa là chia nhỏ tập hợp kết quả thành nhiều tập hợp nhỏ hơn để phân tích từng tập hợp một trong số chúng riêng biệt.
Tạo cửa sổ với Row_Number ()
Để tạo một cửa sổ SQL trong tập kết quả của chúng tôi, chúng tôi sẽ cần phải phân vùng nó dựa trên bất kỳ cột nào mà nó chứa.
Bây giờ chúng ta có thể phân vùng kết quả được thiết lập theo vùng như sau:
- Tạo cửa sổ SQL dựa trên RegionSELECT ROW_NUMBER () OVER (Phân vùng theo khu vực ORDER THEO khu vực) dưới dạng Region_Serial_Number, Name, Region FROM dbo.Product
Chọn - Trên mệnh đề
Nói cách khác, Chọn với Hết mệnh đề mở đường cho các hàm cửa sổ SQL bằng cách phân vùng tập hợp kết quả thành các cửa sổ nhỏ hơn.
Theo tài liệu của Microsoft, Chọn với Hết mệnh đề xác định một cửa sổ sau đó có thể được sử dụng bởi bất kỳ chức năng cửa sổ nào.
Bây giờ, hãy tạo một bảng có tên là Sản phẩm nhà bếp như sau:
TẠO BẢNG [dbo]. [KitchenProduct] ([KitchenProductId] INT NOT NULL PRIMARY KEY IDENTITY (1,1), [Name] VARCHAR (40) NOT NULL, [Country] VARCHAR (40) NOT NULL, [Số lượng ] INT NOT NULL, [Price] DECIMAL (10,2) NOT NULL); GOINSERT INTO dbo.KitchenProduct (Tên, Quốc gia, Số lượng, Giá) GIÁ TRỊ ('Ấm siêu tốc', 'Đức', 10,15.00), ('Ấm đun nước ',' UK ', 20,12.00), (' Toaster ',' France ', 10,10.00), (' Toaster ',' UAE ', 10,12.00), (' Kitchen Clock ',' UK ', 50 , 20,00), ('Đồng hồ nhà bếp', 'UAE', 35,15,00)Bây giờ, hãy xem bảng:
CHỌN [KitchenProductId], [Name], [Country], [Số lượng], [Giá] FROM dbo.KitchenProduct
Nếu bạn muốn xem từng sản phẩm với số sê-ri riêng thay vì một số dựa trên ID sản phẩm tổng quát, thì bạn sẽ phải sử dụng hàm cửa sổ SQL để phân vùng kết quả được đặt theo sản phẩm như sau:
- Xem từng sản phẩm trong chuỗi riêng của nóSELECT ROW_NUMBER () HẾT (Phân vùng theo Tên thứ tự theo Tên) Sản phẩm_SrNo, Tên, Quốc gia, Số lượngFROM dbo.Khu bếpProduct
Khả năng tương thích (Chọn - Hơn Khoản)
Theo tài liệu của Microsoft Mệnh đề Select - Over tương thích với các phiên bản cơ sở dữ liệu SQL sau:
- SQL Server 2008 trở lên
- Cơ sở dữ liệu Azure SQL
- Kho dữ liệu Azure SQL
- Kho dữ liệu song song
Cú pháp
CHỌN - HẾT (Phân vùng theo
Thứ tự theo ) Xin lưu ý rằng tôi đã đơn giản hóa cú pháp để làm cho i t dễ hiểu; vui lòng tham khảo the Tài liệu của Microsoft để xem đầy đủ cú pháp.
Điều kiện tiên quyết
Bài viết này về cơ bản được viết cho người mới bắt đầu, nhưng vẫn có một số điều kiện tiên quyết cần phải ghi nhớ.
Quen thuộc với T-SQL
Bài viết này giả định rằng người đọc có kiến thức cơ bản về T-SQL và có khả năng viết và chạy các tập lệnh SQL cơ bản.
Thiết lập bảng mẫu Bán hàng
Bài viết này yêu cầu bảng mẫu sau để chúng tôi có thể chạy các ví dụ về hàm cửa sổ SQL của mình:
- (1) Tạo bảng mẫu Bán hàngBẢNG MÃ SỐ [dbo]. [Bán hàng] ([SalesId] INT NOT NULL IDENTITY (1,1), [Product] VARCHAR (40) NOT NULL, [Date] DATETIME2, [Doanh thu] DECIMAL (10,2), CONSTRAINT [PK_Sales] TỪ KHÓA CHÍNH ([SalesId])); ĐI-- (2) Điền bảng mẫu Bán hàngSET IDENTITY_INSERT [dbo]. [Bán hàng] ONINSERT INTO [dbo]. [Bán hàng ] ([SalesId], [Product], [Date], [Revenue]) CÁC GIÁ TRỊ (1, N'Laptop ', N'2017-01-01 00:00:00', CAST (200,00 AS Decimal (10, 2) ))) CHÈN VÀO [dbo]. [Doanh số] ([Doanh số], [Sản phẩm], [Ngày], [Doanh thu]) GIÁ TRỊ (2, N'PC ', N'2017-01-01 00:00:00 ', CAST (100,00 AS Decimal (10, 2))) CHÈN VÀO [dbo]. [Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (3, N'Mobile Phone', N'2018-01-01 00:00:00 ', CAST (300,00 AS Decimal (10, 2))) CHÈN VÀO [dbo]. [Sales] ([SalesId], [Product], [Date], [Revenue ]) GIÁ TRỊ (4, N'Accessories ', N'2018-01-01 00:00:00', CAST (150,00 AS Decimal (10, 2))) CHÈN VÀO [dbo]. [Sales] ([SalesId] , [Sản phẩm], [Ngày], [Doanh thu]) GIÁ TRỊ (5, N'iPad ', N'2019-01- 01 00:00:00 ', CAST (300.00 AS Decimal (10, 2))) CHÈN VÀO [dbo]. [Doanh số] ([SalesId], [Sản phẩm], [Ngày], [Doanh thu]) GIÁ TRỊ (6, N'PC ', N'2019-01-01 00:00:00', CAST (200.00 AS Decimal (10, 2))) CHÈN VÀO [dbo]. [Sales] ([SalesId], [Product], [ Ngày], [Doanh thu]) VALUES (7, N'Laptop ', N'2019-01-01 00:00:00', CAST (300,00 AS Decimal (10, 2))) ĐẶT IDENTITY_INSERT [dbo]. [Doanh số ] TẮTXem tất cả doanh số bán hàng bằng cách chạy tập lệnh sau:
- Xem doanh số bán hàngSELECT [SalesId], [Sản phẩm], [Ngày], [Doanh thu] FROM dbo.Sales
Nhóm By so với Hàm cửa sổ SQL
Người ta có thể tự hỏi - sự khác biệt giữa việc sử dụng mệnh đề Group By và các hàm cửa sổ SQL là gì?
Chà, câu trả lời nằm trong các ví dụ dưới đây.
Nhóm theo Ví dụ
Để xem tổng doanh số bán hàng theo sản phẩm, chúng ta có thể sử dụng Nhóm Theo như sau:
- Tổng doanh số theo sản phẩm bằng cách sử dụng Sản phẩm theo nhóm BySELECT, SUM (DOANH THU) AS Total_SalesFROM dbo.SalesGROUP THEO SẢN PHẨM THEO SẢN PHẨM
Vì vậy, mệnh đề Group By giúp chúng ta xem tổng doanh số bán hàng. Tổng giá trị bán hàng là tổng doanh thu của tất cả các sản phẩm tương tự trong cùng một hàng mà không sử dụng điều khoản Nhóm Theo. Điều gì sẽ xảy ra nếu chúng ta muốn xem doanh thu (bán) của từng sản phẩm riêng lẻ cùng với tổng doanh số bán hàng?
Đây là lúc các hàm cửa sổ SQL hoạt động.
Ví dụ về hàm cửa sổ SQL
Để xem sản phẩm, doanh thu và tổng doanh thu theo tất cả các sản phẩm tương tự, chúng tôi phải phân vùng dữ liệu trên cơ sở sản phẩm phụ bằng cách sử dụng OVER () như sau:
- Tổng doanh số bán hàng theo sản phẩm sử dụng hàm cửa sổ SQLĐầu ra sẽ như sau:
Vì vậy, bây giờ chúng ta có thể dễ dàng xem doanh số bán hàng cho từng sản phẩm riêng lẻ cùng với tổng doanh số bán hàng cho sản phẩm đó. Ví dụ:doanh thu cho PC là 100,00 nhưng là tổng doanh thu (tổng doanh thu của PC product) là 300,00 vì hai mẫu PC khác nhau đang được bán.
Phân tích cơ bản với các hàm tổng hợp
Các hàm tổng hợp trả về một giá trị duy nhất sau khi thực hiện các phép tính trên một tập dữ liệu.
Trong phần này, chúng ta sẽ khám phá sâu hơn các hàm cửa sổ SQL - cụ thể là bằng cách sử dụng chúng cùng với các hàm tổng hợp để thực hiện phân tích dữ liệu cơ bản.
Các hàm tổng hợp phổ biến
Các hàm tổng hợp phổ biến nhất là:
- Tổng
- Đếm
- Tối thiểu
- Tối đa
- Trung bình (Trung bình)
Phân tích dữ liệu tổng hợp theo sản phẩm
Để phân tích tập kết quả trên cơ sở sản phẩm phụ với sự trợ giúp của các hàm tổng hợp, chúng ta chỉ cần sử dụng một hàm tổng hợp với phân vùng sản phẩm phụ bên trong câu lệnh OVER ():
- Phân tích dữ liệu theo sản phẩm bằng cách sử dụng các hàm tổng hợpSELECT Sản phẩm, Doanh thu, TỔNG (DOANH THU) HƠN (PHẦN THEO SẢN PHẨM) là Tổng_số bán, TỐI THIỂU (DOANH THU) HƠN (PHẦN THEO SẢN PHẨM) là Số lần bán tối thiểu, TỐI ĐA (DOANH THU) HẾT (PHẦN BẰNG PRODUCT) dưới dạng Maximum_Sales, AVG (DOANH THU) HƠN (PHẦN THEO SẢN PHẨM) dưới dạng Average_Sales TỪ dbo.Sales
Nếu bạn xem xét kỹ hơn PC hoặc Máy tính xách tay sản phẩm , bạn sẽ thấy các hàm tổng hợp đang hoạt động cùng nhau như thế nào cùng với hàm cửa sổ SQL.
Trong ví dụ trên, chúng ta có thể thấy rằng giá trị Doanh thu cho PC là 100,00 lần đầu tiên và 200,00 lần tiếp theo, nhưng Tổng Doanh số lên tới 300,00. Thông tin tương tự có thể được nhìn thấy cho phần còn lại của các chức năng tổng hợp.
Phân tích dữ liệu tổng hợp theo ngày
Bây giờ, chúng ta hãy thực hiện một số phân tích dữ liệu của các sản phẩm trên cơ sở từng ngày bằng cách sử dụng các hàm cửa sổ SQL kết hợp với các hàm tổng hợp.
Lần này, chúng ta sẽ phân vùng kết quả được đặt theo ngày thay vì theo sản phẩm như sau:
- Phân tích dữ liệu theo ngày bằng cách sử dụng các hàm tổng hợpSELECT Sản phẩm, ngày, Doanh thu, SUM (DOANH THU) HƠN (PHẦN THEO NGÀY) là Total_Sales, MIN (REVENUE) OVER (PARTITION BY DATE) là Minimum_Sales, MAX (REVENUE) HƠN ( PARTITION BY DATE) là Maximum_Sales, AVG (REVENUE) OVER (PARTITION BY DATE) là Average_Sales FROM dbo.Sales
Với điều này, chúng ta đã học các kỹ thuật phân tích dữ liệu cơ bản bằng cách sử dụng phương pháp tiếp cận các hàm cửa sổ SQL.
Việc cần làm
Bây giờ bạn đã quen với các hàm cửa sổ SQL, hãy thử các cách sau:
- Hãy ghi nhớ các ví dụ mà chúng tôi đã xem xét, thực hiện phân tích dữ liệu cơ bản bằng cách sử dụng các hàm cửa sổ SQL trên cơ sở dữ liệu mẫu được đề cập trong bài viết này.
- Thêm cột Khách hàng vào bảng mẫu Bán hàng và xem phân tích dữ liệu của bạn có thể trở nên phong phú như thế nào khi thêm một cột khác (khách hàng) vào bảng đó.
- Thêm cột Khu vực vào bảng mẫu Bán hàng và thực hiện phân tích dữ liệu cơ bản bằng cách sử dụng các hàm tổng hợp theo khu vực.