Theo Microsoft BOL DENSE_RANK chính thức là không điều kiện ( RANK () ). Nhưng theo Chức năng xếp hạng của Itzik Ben-Gan "... các hàm RANK () và DENSE_RANK () luôn mang tính quyết định". Ai đúng?
Những gì tôi đã tìm thấy cho đến nay: Định nghĩa của Microsoft "Các hàm xác định luôn trả về cùng một kết quả bất cứ khi nào chúng được gọi với một bộ giá trị đầu vào cụ thể và được đưa ra cùng một trạng thái của cơ sở dữ liệu."
Vì vậy, trong bảng lý thuyết nhân viên
Employee Salary
Sue Right 1.00
Robin Page 1.00
Phil Factor 1.00
và nhân viên2
Employee Salary
Phil Factor 1.00
Sue Right 1.00
Robin Page 1.00
giống nhau. Nhưng các hàm Xếp hạng trả về các giá trị khác nhau:
CREATE TABLE [dbo].[Employees](
--[ID] [int] IDENTITY(1,1) NOT NULL,
[Employee] [varchar](150) NOT NULL,
[Salary] [smallmoney] NULL,
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Employees2](
--[ID] [int] IDENTITY(1,1) NOT NULL,
[Employee] [varchar](150) NOT NULL,
[Salary] [smallmoney] NULL,
) ON [PRIMARY]
INSERT INTO [dbo].[Employees]
([Employee] ,[Salary])
VALUES
('Sue Right', 1)
, ('Robin Page', 1)
,('Phil Factor', 1 )
GO
INSERT INTO [dbo].[Employees2]
([Employee] ,[Salary])
VALUES
('Phil Factor', 1 )
,('Sue Right', 1)
,('Robin Page', 1)
GO
SELECT RANK() OVER ( ORDER BY Salary) AS [Rank]
, DENSE_RANK() OVER (ORDER BY Salary ) AS [Dense_rank]
, [Employee]
FROM
dbo.Employees
SELECT RANK() OVER ( ORDER BY Salary) AS [Rank]
, DENSE_RANK() OVER (ORDER BY Salary ) AS [Dense_rank]
, [Employee]
FROM
dbo.Employees2
SELECT NTILE(3) OVER ( ORDER BY SALARY )
, [Employee]
FROM
dbo.Employees
SELECT NTILE(3) OVER ( ORDER BY SALARY )
, [Employee]
FROM
dbo.Employees2