排名功能结构

时间:2010-09-08 10:23:06

标签: sql-server tsql dense-rank

我知道排名功能的DENSE_RANK()函数及其工作。但是我总是只编写这个函数的名字而且它隐含地执行它的工作无法看到它是如何显式工作的,我喜欢看它用T_SQL语言在这个函数中执行操作的结构。你能不能帮帮我吧。

1 个答案:

答案 0 :(得分: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