在SQL Server中查找最近的不平衡下线

时间:2013-07-03 15:53:15

标签: sql-server database

我的表格包含以下列:TransactionID, MemberID, ParentID

这是推荐计划,一个人指2个人,他们2指另外2个人

我想找一个来自特定成员的最近的不平衡节点

如果我试图找到最近的001不平衡节点,那么我会发现尚未平衡/不完整节点的MemberID“003”。

如果我试图找到002的最近的不平衡节点,那么我会发现memberID = 004尚未平衡/未完成节点。

任何人都可以提供帮助..

TransactionID   MemberID    ParentID
1               001          000
2               002          001
3               003          001
4               004          002
5               005          002
6               006          003

1 个答案:

答案 0 :(得分:1)

AS Martin指出,需要递归CTE。这是让你开始的东西。它构建一个完整的节点层次结构,然后选择少于2个子节点的第一个子节点(即层次结构中具有最小深度的子节点)。如果两个子节点在深度上绑定,则选择具有较小member_id的子节点。

declare @starting_node varchar(100) = '001'
;with C as (
select parent_id root_parent, member_id, 1 as depth from #test where
parent_id = @starting_node
union all
select C.root_parent, #test.member_id, C.depth + 1 from #test join C on #test.parent_id = C.member_id
), C1 as (
select parent_id, count(*) number_of_immediate_children from #test 
group by parent_id
) 
select member_id from (
select C.member_id, ROW_NUMBER() over (order by depth, member_id) ranker
from C left join C1 on C.member_id = C1.parent_id
where isnull(number_of_immediate_children, 0) < 2
) Z where ranker = 1