Sql server 在SQL Server中查找最近的下行链路

Sql server 在SQL Server中查找最近的下行链路,sql-server,database,Sql Server,Database,我的表包含以下列:TransactionID、MemberID、ParentID 这是一个推荐计划,一个人推荐两个人,他们推荐另外两个人 我想从特定成员中查找最近的节点 如果我试图找到最近的不平衡节点001,那么我将找到尚未平衡/不完整节点的MemberID 003 如果我试图找到002最近的不平衡节点,那么我将找到尚未平衡/未完成节点的memberID=004 有人能帮忙吗 TransactionID MemberID ParentID 1 001

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

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

我想从特定成员中查找最近的节点

如果我试图找到最近的不平衡节点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

正如Martin Smith所指出的,需要递归CTE。这里有一些东西可以让你开始。它建立完整的节点层次结构,然后选择第一个子节点,即层次结构中深度最小且子节点少于2个的节点。如果两个子节点在深度上绑定,则拾取具有较小成员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

你试过什么吗?您可能需要一个递归CTE。还有,为什么是004而不是005?因为004的TransactionID比005小,我不知道从哪里开始:哦,上帝,你是我的天使,我已经测试过了,运行良好,非常感谢……@revirinaldi,很高兴知道!如果答案对你有用,就接受它