Laut offiziellem Microsoft BOL ist DENSE_RANK nicht deterministisch ( RANK () ). Nach den Ranglistenfunktionen von Itzik Ben-Gan "... sind die Funktionen RANK () und DENSE_RANK () immer deterministisch". Wer hat Recht?
Was ich bisher gefunden habe: Microsoft Definition "Deterministische Funktionen geben immer das gleiche Ergebnis zurück, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden und den gleichen Status der Datenbank haben."
Also in Set Theorie Tabellen Mitarbeiter
Employee Salary
Sue Right 1.00
Robin Page 1.00
Phil Factor 1.00
und Mitarbeiter2
Employee Salary
Phil Factor 1.00
Sue Right 1.00
Robin Page 1.00
sind gleich. Ranking-Funktionen geben jedoch unterschiedliche Werte zurück:
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
quelle