私は同様のタスクを持っていることが起こりました。私が扱っているデータは少し大きかったので、私はこれに効果的なアプローチを見つけなければなりませんでした。基本的に私は2つの作業アプローチを見つけました。
1つは純粋なSQLです - ここではコアクエリです。基本的には、同じコレクションの子を持つ最小のParentIDをグループIDとして使用できます(row_number
で列挙することもできます)。小さなメモとして、私はここでcteを使っていますが、現実世界では、グループ化された親を一時テーブルに入れ、テーブルにインデックスを追加することをお勧めします。
;with cte_parents as (
-- You can also use different statistics to narrow the search
select
[ParentID],
count(*) as cnt,
min([Type]) as min_Type,
max([Type]) as max_Type
from Table1
group by
[ParentID]
)
select
h1.ParentID,
k.ParentID as GroupID
from cte_parents as h1
outer apply (
select top 1
h2.[ParentID]
from cte_parents as h2
where
h2.cnt = h1.cnt and
h2.min_Type = h1.min_Type and
h2.max_Type = h1.max_Type and
not exists (
select *
from (select tt.[Type] from Table1 as tt where tt.[ParentID] = h2.[ParentID]) as tt1
full join (select tt.[Type] from Table1 as tt where tt.[ParentID] = h1.[ParentID]) as tt2 on
tt2.[Type] = tt1.[Type]
where
tt1.[Type] is null or tt2.[Type] is null
)
order by
h2.[ParentID]
) as k
ParentID GroupID
----------- --------------
1 1
2 2
3 1
4 2
もう1つは少しトリッキーなので、使用するときは注意が必要です。しかし驚くべきことに、それほど悪くはありません。アイデアは、子供を大きな文字列に連結し、次にこれらの文字列でグループ化することです。使用可能な連結方法(SQL Server 2017を使用している場合はxml trickまたはclr)を使用できます。重要な点は、すべての文字列がグループを正確に表すように順序付き連結を使用する必要があることです。私はこれのために特別なCLR関数(dbo.f_ConcatAsc
)を作成しました。
;with cte1 as (
select
ParentID,
dbo.f_ConcatAsc([Type], ',') as group_data
from Table1
group by
ParentID
), cte2 as (
select
dbo.f_ConcatAsc(ParentID, ',') as parent_data,
group_data,
row_number() over(order by group_data) as rn
from cte1
group by
group_data
)
select
cast(p.value as int) as ParentID,
c.rn as GroupID,
c.group_data
from cte2 as c
cross apply string_split(c.parent_data, ',') as p
ParentID GroupID group_data
----------- -------------------- --------------------------------------------------
2 1 ChildTypeA,ChildTypeB,ChildTypeC
4 1 ChildTypeA,ChildTypeB,ChildTypeC
1 2 ChildTypeA,ChildTypeB,ChildTypeC,ChildTypeD
3 2 ChildTypeA,ChildTypeB,ChildTypeC,ChildTypeD
私はまだあなたがどのようにasisgn configgroupを取得しないのですか – TheGameiswar
設定の「有限集合」についてもっと詳しく説明してください。私たちは1-10構成か1k-100k構成について話していますか?代表的なデータを持つSQLフィドルを歓迎します。 –