sql - 确定自引用表中组的排名

标签 sql sql-server-2008 data-structures hierarchical-data

我再次陷入递归 CTE 的困境。我有一个自引用表,其中每行都有关联的分数。我需要按分数解析叶节点的排序顺序对应于父节点的排序顺序(也按分数排序)。分组如下所示:

Groups                  Score
------------------------------------
Group 1                 0.95
    Group a             0.7
        Group i         0.9
        Group ii        0.7
    Group b             0.9
        Group iii       0.5
        Group iv        1.0
Group 2                 0.9
    Group c             0.5
    Group d             0.8
Group 3                 1.0

这是预期的结果集:

GroupID     GroupName   Score   Rank
------------------------------------
11          Group 3     1.0     1
7           Group iv    1.0     2
6           Group iii   0.5     3
3           Group i     0.9     4
4           Group ii    0.7     5
10          Group d     0.8     6
9           Group c     0.5     7

这是示例记录。提前致谢。

declare @tblGroups table (
            GroupID int,
            GroupName nvarchar(50),
            ParentID int,
            Score float
)

insert into @tblGroups values (1, 'Group 1', null, 0.95)
insert into @tblGroups values (2, 'Group a', 1, 0.7)
insert into @tblGroups values (3, 'Group i', 2, 0.9)
insert into @tblGroups values (4, 'Group ii', 2, 0.7)
insert into @tblGroups values (5, 'Group b', 1, 0.9)
insert into @tblGroups values (6, 'Group iii', 5, 0.5)
insert into @tblGroups values (7, 'Group iv', 5, 1.0)

insert into @tblGroups values (8, 'Group 2', null, 0.9)
insert into @tblGroups values (9, 'Group c', 8, 0.5)
insert into @tblGroups values (10, 'Group d', 8, 0.8)

insert into @tblGroups values (11, 'Group 3', null, 1.0)

select 
    g.* 
from 
    @tblGroups g

最佳答案

编辑:根据下面的评论,问题似乎比我想象的要容易:

declare @tblGroups table ( GroupId int, GroupName nvarchar(50), ParentId int, Score float ) 
insert into @tblGroups values (1, 'Group 1', null, 0.95)    
insert into @tblGroups values (2, 'Group a', 1, 0.7)    
insert into @tblGroups values (3, 'Group i', 2, 0.9)    
insert into @tblGroups values (4, 'Group ii', 2, 0.7)    
insert into @tblGroups values (5, 'Group b', 1, 0.9)    
insert into @tblGroups values (6, 'Group iii', 5, 0.5)    
insert into @tblGroups values (7, 'Group iv', 5, 1.0)    

insert into @tblGroups values (8, 'Group 2', null, 0.9)    
insert into @tblGroups values (9, 'Group c', 8, 0.5)    
insert into @tblGroups values (10, 'Group d', 8, 0.8)    

insert into @tblGroups values (11, 'Group 3', null, 1.0)    

select * from @tblGroups

; with Greg as (
  -- The roots have no parents.
  select GroupId, GroupName, ParentId, Score,
    Cast( Right( '00000' + Cast( Row_Number() over ( order by Score desc ) as VarChar(6) ), 6 ) as VarChar(1024) ) as OverallRank
    from @tblGroups
    where ParentId is NULL
  union all
  -- Add the children one generation at a time.
  select T.GroupId, T.GroupName, T.ParentId, T.Score,
    Cast( G.OverallRank + Right( '00000' + Cast( Row_Number() over ( order by T.Score desc ) as VarChar(6) ), 6 ) as VarChar(1024) )
    from Greg as G inner join
      @tblGroups as T on T.ParentId = G.GroupId
  )
  select *
    from Greg as G
    where not exists ( select 42 from @tblGroups where ParentId = G.GroupId ) -- Leaf nodes only.
    order by OverallRank

关于sql - 确定自引用表中组的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9960255/

相关文章:

sql-server - 全文关键字unicode

sql - 使用递归公用表表达式从两个表中查找连续编号

c++ - std::unordered_set 如何存在病理输入?

algorithm - 查找二叉堆的最后一个元素

arraylist - 是否可以创建一个具有 log(n) 复杂度的 ArrayList 属性的 Map?

mysql - mysql中如何分组显示第一条数据?

sql - 基于子查询显示列

SQL - MS Access - 在两个已知文本字符串之间搜索文本

sql - UML转SQL工具

SQL 嵌套聚合查询 - 如何获得每位员工的客户数量?