-1

私のテーブルには次の列が含まれています:TransactionID, MemberID, ParentID

これは紹介プログラムです。1 人の男性が 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
4

1 に答える 1

1

Martin Smith が指摘したように、再帰的な CTE が必要です。ここから始めましょう。完全なノード階層を構築し、2 つ未満の子を持つ最初の子ノード (つまり、階層内で最小の深さを持つノード) を選択します。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
于 2013-07-03T18:46:03.910 に答える