Các hàm Ranking mới trong SQL Server 2005

Cùng với SQL Server 2005, Microsoft đã giới thiệu một số tính năng mới và những tính năng này sẽ giúp cho chuyên viên về DBA hay SQL Server dễ dàng hơn trong việc viết mã và duy trì cơ sở dữ liệu SQL Server. Bài này sẽ thảo luận về các hàm ranking mới được cung cấp trong SQL Server 2005. Các tính năng mới đó sẽ giúp bạn dễ dàng viết mã T-SQL để kết hợp xếp loại được tập hợp kết quả của bạn. Bài sẽ hướng dẫn từng phần trong các hàm ranking mới và cung cấp một số ví dụ nhằm minh họa hoạt động của hàm.

Các hàm Ranking là gì?

Các hàm Ranking cho phép bạn có thể đánh số liên tục (xếp loại) cho các tập hợp kết quả. Các hàm này có thể được sử dụng để cung cấp số thứ tự trong hệ thống đánh số tuần tự khác nhau. Có thể hiểu đơn giản như sau: bạn có từng con số nằm trên từng dòng liên tục, tại dòng thứ nhất xếp loại số 1, dòng thứ 2 xếp loại số là 2… Bạn có thể sử dụng hàm ranking theo các nhóm số tuần tự, mỗi một nhóm sẽ được đánh số theo lược đồ 1,2,3 và nhóm tiếp theo lại bắt đầu bằng 1,2,3…

Dữ liệu chạy thử cho các ví dụ

Để có một vài ví dụ cho từng hàm ranking, tôi cần thiết lập một số dữ liệu chạy thử. Trong dữ liệu chạy thử, tôi sử dụng một bảng “Person” khá đơn giản. Bảng sẽ bao gồm 3 cột “FirstName”, “Age” và “Gender”. Đoạn mã dưới nhằm tạo ra và ghi lại dữ liệu chạy thử vào file.

SET NOCOUNT ON
CREATE TABLE Person(
FirstName VARCHAR(10),
Age INT,
Gender CHAR(1))
INSERT INTO Person VALUES ('Ted',23,'M')
INSERT INTO Person VALUES ('John',40,'M')
INSERT INTO Person VALUES ('George',6,'M')
INSERT INTO Person VALUES ('Mary',11,'F')
INSERT INTO Person VALUES ('Sam',17,'M')
INSERT INTO Person VALUES ('Doris',6,'F')
INSERT INTO Person VALUES ('Frank',38,'M')
INSERT INTO Person VALUES ('Larry',5,'M')
INSERT INTO Person VALUES ('Sue',29,'F')
INSERT INTO Person VALUES ('Sherry',11,'F')
INSERT INTO Person VALUES ('Marty',23,'F')

Hàm ROW_NUMBER

Hàm đầu tiên tôi muốn nói tới là ROW_NUMBER. Hàm này trả lại một dãy số tuần tự bắt đầu từ 1 cho mỗi dòng hay nhóm trong tập hợp kết quả. Hàm ROW_NUMBER sẽ có cú pháp sau:

ROW_NUMBER ( ) OVER ( [ <Mệnh đề PARTITION BY> ] <Mệnh đề ORDER BY>)

Trong đó:

<Mệnh đề PARTITION BY> là cột hay tập hợp các cột được sử dụng để quyết định việc gộp nhóm cho hàm ROW_NUMBER áp dụng cho việc đánh số tuần tự.

<Mệnh đề ORDER BY> là một cột hay tập hợp các cột được sử dụng để sắp xếp tập hợp kết quả trong nhóm (partition)

Để hiểu thêm về cách sử dụng hàm ROW_NUMBER, ví dụ dưới sẽ đánh số liên tục cho tất cả các dòng trong bảng Person và sắp xếp chúng theo trường Age

       Age 
       FirstName, 
SELECT ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender], 
       Gender 
Partition by Gender  FirstName  Age         Gender
2                    Mary       11          F
1                    Larry      5           M
4                    Ted        23          M
7                    John       40          M

Trong ví dụ này tôi đã phân vùng bởi Gender và sắp xếp theo Age. Thực hành theo ví dụ này sẽ cho phép tôi đánh số tuần tự các bản ghi là Female trong bảng Person theo độ tuổi, và sau đó việc đánh số sẽ bắt đầu lại với nhóm là Male.

Hàm RANK

Đôi khi bạn muốn một dòng có cùng sắp xếp giá trị cột như các dòng khác có cùng một xếp loại. Nếu thế thì hàm RANK () có thể giúp bạn. Hàm RANK có cú pháp như sau:

RANK ( ) OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>)

Trong đó:

<Mệnh đề PARTITION BY> là một cột hay tập hợp các cột được sử dụng để quyết đinh việc đánh số liên tục trong hàm RANK

<Mệnh đề ORDER BY> là một cột hay tập hợp các cột được sử dụng để sắp xếp tập hợp kết quả trong nhóm (partition)

Hàm RANK sẽ đánh số liên tục một tập hợp bản ghi nhưng khi có 2 dòng có cùng giá trị sắp xếp thì hàm sẽ đánh giá là cùng bậc giá trị. Giá trị xếp loại vẫn sẽ tăng kể cả khi có 2 dòng cùng giá trị, vì vậy khi đánh giá một giá trị sắp xếp tiếp theo thì số thứ tự vẫn tiếp tục được đánh nhưng sẽ tăng thêm 1 giá trị vào các dòng tiếp theo trong tập hợp.

Đây là ví dụ của hàm rank trong tập hợp bản ghi sắp xếp theo Age:

       Age
-------------------- ---------- ------
2                    George     6
6                    Sam        17
9                    Sue        29
SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender],
       Gender
-------------------- ---------- ----------- ------
2                    Sherry     11          F
2                    George     6           M
4                    Marty      23          M
SELECT DENSE_RANK() OVER (ORDER BY Age) AS [Dense Rank by Age], 
  FROM Person 

 

Đoạn mã trên sẽ xuất ra như sau:

1                    Larry      5
3                    Mary       11
5                    Ted        23
7                    Frank      38
       Age, 
FirstName  Age         Age Groups
Doris      6           1
Sherry     11          2
Marty      23          2
John       40          3

 

 

Trong tập hợp kết quả đã có ở trên với 3 nhóm Age khác nhau. Nhóm đầu tiên bắt đầu từ 5 đến 11 tuổi, nhóm thứ 2 bắt đầu từ 11 đến 23 và nhóm cuối cùng là từ 29 đến 40. Hàm NTILE chỉ có tác dụng chia đều số lượng các bản ghi và đưa vào từng nhóm số. Sử dụng hàm NTILE cho từng bản ghi trong một nhóm sẽ đưa gia các xếp loại giống nhau.

Hàm NTILE là một hàm rất có ích nếu bạn chỉ muốn trả lại một nhóm cụ thể trong các bản ghi. Dưới đây là một ví dụ khi tôi muốn trả lại chỉ nhóm người có độ tuổi chung bình (Nhóm Age 2) từ ví dụ trên.

       Age AS [Age Group]
              NTILE(3) OVER (ORDER BY Age) AS AgeGroup
FirstName  Age         Age Group
Sam        17          17

Tin nổi bật

Tin cùng chuyên mục

Tin mới nhất