То, что вы, кажется, хотят, основываясь на ожиданиях, является (плотный) ранжирование на основе родителей узлов.
Что вам нужно для достижения этого, это просто порядок со стороны родителя. Если вы раздел от родителя, вы получаете ранг узла внутри каждого родителя.
WITH
-- CTE to generate the same data
tree AS (
SELECT 1 AS node, 0 AS parent
UNION ALL SELECT 2, 1
UNION ALL SELECT 3, 1
UNION ALL SELECT 4, 2
UNION ALL SELECT 5, 2
UNION ALL SELECT 6, 3
UNION ALL SELECT 7, 3
)
SELECT
node,
parent,
DENSE_RANK() OVER (ORDER BY parent) AS your_rank
FROM tree;
Как documentation читает, секционирование ...
[d] ivides результирующего набора, полученный с помощью ЕКА на разделы, к которым применяются функция DENSE_RANK.
Так что, если вы разделите родителем, вы говорите SQL Server, чтобы сделать небольшие группы узлов на родителя, а затем вычислить ранг в этой группе, начиная с более чем на 1 для каждой группы.
Ваш ожидаемый результат не является 'dense_rank'. Ваш результат - «parent + 1». – JohnHC