密集等级功能

时间:2016-10-18 09:53:02

标签: sql sql-server

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

为什么密集排名功能不是按父母方式分组的?

5 个答案:

答案 0 :(得分:5)

试试这个:

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

您不必使用dense_rank()中的分区只需按父母的顺序完成工作。

答案 1 :(得分:3)

在没有PARTITION的情况下使用它:

;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

注意:PARTITIONFROM子句生成的结果集划分为应用DENSE_RANK函数的分区。因此,结果集按parent分区,并按node排序。并且您需要在所有行上使用 partition ,这就是您不需要按任何列进行分区的原因。

答案 2 :(得分:1)

使用以下脚本。

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

示例输出:

enter image description here

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

答案 4 :(得分:0)

根据预期,您似乎想要的是基于节点父母的(密集)排名。

要实现这一目标,您需要做的只是父母的命令。如果您按父级分区,则会获得每个父级中的节点的等级。

if (!string.IsNullOrWhiteSpace(computed))
            {
                connect.Open();
                OleDbCommand command = new OleDbCommand();
                command.Connection = connect;
                command.CommandText = "update Table1 set ot='" + computed + "' where Fname = '" + uname + "' ";
                command.ExecuteNonQuery();
                connect.Close();
                MessageBox.Show("Save Complete");
            }

documentation读取一样,分区......

  

[d]将FROM子句产生的结果集存储到应用了DENSE_RANK函数的分区中。

因此,如果您按父级进行分区,则告诉SQL Server每个父级创建一小组节点,然后计算该组中的级别,从每个组的1开始。