Menurut Microsoft BOL DENSE_RANK resmi adalah nondeterministic ( RANK () ). Tetapi menurut Fungsi Pemeringkatan oleh Itzik Ben-Gan "... fungsi RANK () dan DENSE_RANK () selalu bersifat deterministik". Siapa yang benar?
Apa yang saya temukan sejauh ini: Definisi Microsoft "Fungsi deterministik selalu mengembalikan hasil yang sama setiap kali mereka dipanggil dengan serangkaian nilai input tertentu dan diberi status database yang sama."
Jadi dalam tabel teori Set Karyawan
Employee Salary
Sue Right 1.00
Robin Page 1.00
Phil Factor 1.00
dan Karyawan2
Employee Salary
Phil Factor 1.00
Sue Right 1.00
Robin Page 1.00
adalah sama. Tetapi fungsi Pemeringkatan mengembalikan nilai yang berbeda:
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