공식 Microsoft BOL 에 따르면 DENSE_RANK는 비 결정적입니다 ( RANK () ). 그러나 Itzik Ben-Gan의 순위 함수에 따르면 "... RANK () 및 DENSE_RANK () 함수는 항상 결정적입니다." 누구가 옳습니까?
지금까지 내가 찾은 것 : Microsoft의 정의 "결정적 함수는 특정 입력 값 세트로 호출되고 데이터베이스의 동일한 상태가 제공 될 때마다 항상 동일한 결과를 리턴합니다."
Set 이론 테이블에서
Employee Salary
Sue Right 1.00
Robin Page 1.00
Phil Factor 1.00
직원 2
Employee Salary
Phil Factor 1.00
Sue Right 1.00
Robin Page 1.00
동일합니다. 그러나 순위 함수는 다른 값을 반환합니다.
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