2010-09-08 66 views
1

我知道排名函數的DENSE_RANK()函數及其工作。但是我總是隻寫這個函數的名字,而且它隱含地做了它的工作,看不到它是如何工作的,我喜歡看它的結構,它使用T_SQL語言在這個函數中執行操作。你能幫我一下嗎?排名函數結構

回答

1

您可以從執行計劃中看到這一點。

示例代碼

CREATE TABLE #T 
(ID INT IDENTITY(1,1) PRIMARY KEY, 
G INT NOT NULL, 
S INT NOT NULL) 

INSERT INTO #T (G, S) VALUES (1,1),(1,1),(1,3),(1,4),(2,1) 

SELECT G,S, DENSE_RANK() OVER (PARTITION BY G ORDER BY S) AS D 
FROM #T 

執行計劃

enter image description here

說明

它首先需要爲了G,S爲對數據進行排序沒有適合使用的預分類索引。

然後有2個分段迭代器。段迭代器具有「GROUP BY」屬性。他們輸出分段列,指示當前行是否與前一行在同一組中。

第一個分段迭代器按分區列G分組並輸出分段列Segment1004。

第二個分段迭代器按G,S分組並輸出Segment1005作爲分段列。

Sequence Project迭代器根據這些輸入輸出dense_rank值。如果Segment1004指示這是一個新的分區組,它將輸出1,否則它將檢查Segment1005的值以知道是否輸出與上次相同的值或首先增加它。

See this article by Paul White for more