आधिकारिक Microsoft BOL DENSE_RANK के अनुसार nondeterministic ( RANK () ) है। लेकिन इत्ज़िक बेन-गान द्वारा रैंकिंग फ़ंक्शंस के अनुसार ... RANK () और DENSE_RANK () फ़ंक्शंस हमेशा निर्धारक होते हैं "। कौन सही है?
मैंने अब तक क्या पाया है: Microsoft की परिभाषा "नियतात्मक कार्य हमेशा उसी परिणाम को वापस करते हैं जब भी उन्हें इनपुट मानों के एक विशिष्ट सेट के साथ बुलाया जाता है और डेटाबेस की समान स्थिति दी जाती है।"
तो सेट सिद्धांत तालिकाओं में कर्मचारी
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