2010-09-08 2 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 и выдает Сегмент1005 в качестве столбца сегмента.

Итератор проекта Sequence выводит значение dense_rank на основе этих входов. Он выдает 1, если Segment1004 указывает, что это новая группа разделов, иначе он проверит значение Segment1005, чтобы узнать, следует ли выводить то же значение, что и в прошлый раз, или сначала увеличивать его.

See this article by Paul White for more

Смежные вопросы