-- Database by Doug
-- Douglas Kline
-- 10/12/2017
-- Quick! What's the difference between RANK, DENSE_RANK, and ROW_NUMBER?
-- in short, they are only different when there are ties...
-- here's a table that will help show the difference
-- between the ranking functions
-- note the [Score] column,
-- it will be the basis of the ranking
SELECT [Name],
[Score]
FROM (VALUES ('A', 100),
('B', 101),
('C', 101),
('D', 101),
('E', 102),
('F', 103) ) AS Temp([Name], [Score])
ORDER BY [Score] ASC
-- first, ROW_NUMBER
SELECT [Name],
[Score],
ROW_NUMBER() OVER (ORDER BY [Score]) AS [row_number]
FROM (VALUES ('A', 100),
('B', 101),
('C', 101),
('D', 101),
('E', 102),
('F', 103) ) AS Temp([Name], [Score])
ORDER BY [Score] ASC
-- row number gives every item a unique number
-- it does NOT recognize ties
-- no numbers are repeated, no numbers are skipped
-- next, RANK()
SELECT [Name],
[Score],
ROW_NUMBER() OVER (ORDER BY [Score]) AS [row_number],
RANK() OVER (ORDER BY [Score]) AS [rank]
FROM (VALUES ('A', 100),
('B', 101),
('C', 101),
('D', 101),
('E', 102),
('F', 103) ) AS Temp([Name], [Score])
ORDER BY [Score] ASC
-- RANK() recognizes "ties" by repeating the same rank value
-- but then skipping to the next row_number
-- note the skip from 2,2,2 to rank of 5
-- now look at dense rank
SELECT [Name],
[Score],
ROW_NUMBER() OVER (ORDER BY [Score]) AS [row_number],
RANK() OVER (ORDER BY [Score]) AS [rank],
DENSE_RANK() OVER (ORDER BY [Score]) AS [dense_rank]
FROM (VALUES ('A', 100),
('B', 101),
('C', 101),
('D', 101),
('E', 102),
('F', 103) ) AS Temp([Name], [Score])
ORDER BY [Score] ASC
-- dense_rank handles ties
-- but does not "skip" ranks
-- note the 2, 2, 2 then 3
-- row_number, rank, and dense_rank
-- are the SAME when there are no ties
-- to prove it, see this, where the Scores are all unique
SELECT [Name],
[Score],
ROW_NUMBER() OVER (ORDER BY [Score]) AS [row_number],
RANK() OVER (ORDER BY [Score]) AS [rank],
DENSE_RANK() OVER (ORDER BY [Score]) AS [dense_rank]
FROM (VALUES ('A', 100),
('B', 101.0), -- added a decimal point
('C', 101.1), -- to break the ties
('D', 101.2),
('E', 102),
('F', 103) ) AS Temp([Name], [Score])
ORDER BY [Score] ASC
-- Database by Doug
-- Douglas Kline
-- 10/12/2017
-- Quick! What's the difference between RANK, DENSE_RANK, and ROW_NUMBER?
Thursday, October 12, 2017
Quick! What's the difference between RANK, DENSE_RANK, and ROW_NUMBER?
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment