我的表格包含以下列: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
答案 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