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 :(得分: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
注意:PARTITION
将FROM
子句生成的结果集划分为应用DENSE_RANK
函数的分区。因此,结果集按parent
分区,并按node
排序。并且您需要在所有行上使用 partition ,这就是您不需要按任何列进行分区的原因。
答案 2 :(得分:1)
答案 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开始。