2016-10-18 3 views
1
select node, parent, dense_rank() over (partition by parent order by node) 
from tree 

Когда я запускаю этот запрос я получаюПлотные функция ранга

node parent (No column name) 
1 0  1 
2 1  1 
3 1  2 
4 2  1 
5 2  2 
6 3  1 
7 3  2 

Где я ожидал следующий результат

node parent (No column name) 
1  0  1 
2  1  2 
3  1  2 
4  2  3 
5  2  3 
6  3  4 
7  3  4 

Почему густая функция ранга не группа родитель-накрест?

+0

Ваш ожидаемый результат не является 'dense_rank'. Ваш результат - «parent + 1». – JohnHC

ответ

1

используйте приведенный ниже сценарий.

select node,parent,dense_rank() over (order by parent) from tree 

Образец Выход:

enter image description here

+0

, но что не так в моем запросе? пожалуйста, объясните мне – ARJUN

+0

, если вы используете раздел dense_rank() будет рассчитывать на основе секционированного столбца, означает, что если какое-либо значение изменения в секционированном столбце, счетчик будет сброшен на один. –

+0

Должно быть 'over (order by parent, node)' да? –

5

Попробуйте это:

select node,parent,dense_rank() over (order by parent) from tree 

Вы не должны использовать раздел в dense_rank() только для того, родителем будет делать эту работу.

+0

, вы должны использовать родительский элемент в предложении order by. –

+1

yup .. +1 .. Я тоже разместил то же самое ..:) –

+0

сэр я уже получил результат, но почему раздел меняет мой результат – ARJUN

3

С его помощью можно без РАЗДЕЛА:

;WITH tree AS (
SELECT * 
FROM (VALUES 
(1,0),(2, 1),(3, 1),(4, 2),(5, 2), (6, 3), (7, 3) 
) as t(node, parent) 
) 

select node, 
     parent, 
     dense_rank() over (order by parent) 
from tree 

Выход:

node parent (No column name) 
1  0  1 
3  1  2 
2  1  2 
5  2  3 
4  2  3 
7  3  4 
6  3  4 

Примечание: PARTITION г ловит результирующий набор, созданный предложением FROM, на разделы, к которым применяется функция DENSE_RANK. Таким образом, результирующий набор разбивается на parent и упорядочен по node. И вам нужен раздел по всем строкам, поэтому вам не нужен раздел по любому столбцу.

+0

Что произойдет, если я использую раздел – ARJUN

1

Вам не нужно раздел пунктом

declare @t table(node int, parent int) 
insert into @t 
select 1,0 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) from @t 
0

То, что вы, кажется, хотят, основываясь на ожиданиях, является (плотный) ранжирование на основе родителей узлов.

Что вам нужно для достижения этого, это просто порядок со стороны родителя. Если вы раздел от родителя, вы получаете ранг узла внутри каждого родителя.

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 для каждой группы.

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