Selon le responsable Microsoft, BOL DENSE_RANK n'est pas déterministe ( RANK () ). Mais selon les fonctions de classement d'Itzik Ben-Gan "... les fonctions RANK () et DENSE_RANK () sont toujours déterministes". Qui a raison?
Ce que j'ai trouvé jusqu'à présent: Définition de Microsoft "Les fonctions déterministes renvoient toujours le même résultat chaque fois qu'elles sont appelées avec un ensemble spécifique de valeurs d'entrée et avec le même état de la base de données."
Donc, dans les tables théoriques Set Employés
Employee Salary
Sue Right 1.00
Robin Page 1.00
Phil Factor 1.00
et employés2
Employee Salary
Phil Factor 1.00
Sue Right 1.00
Robin Page 1.00
sont identiques. Mais les fonctions de classement renvoient des valeurs différentes:
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
la source