2

次のようなテーブルがあるとします。

ID | Type | Reference #1 | Reference #2
0  | 1    | [A]          | {a}
1  | 2    | [B]          | {b}
2  | 2    | [B]          | {c}
3  | 1    | [C]          | {d}
4  | 1    | [D]          | {d}
5  | 1    | [E]          | {d}
6  | 1    | [C]          | {e}

「リファレンス#1」と「リファレンス#2」を「フォールバック」としてグループ化するためのより良い方法がないため、何か良い方法はありますか...

たとえば、次のIDをグループ化したいと思います。

{0} [Unique Reference #1], 
{1,2} [Same Reference #1],
{3,4,5,6} [{3,4,5} have same Reference #2 and {3,6} have same Reference #1]

私はこれをどのように行うかについて完全に途方に暮れています...何か考えはありますか?

4

1 に答える 1

3

mellamokbのクエリでは、グループ化は入力の順序に依存します。

すなわち。

VALUES
    (0, 1, '[A]', '{a}'),
    (1, 2, '[B]', '{b}'),
    (2, 2, '[B]', '{c}'),
    (3, 1, '[C]', '{d}'), // group 3
    (4, 1, '[D]', '{d}'), // group 3
    (5, 1, '[E]', '{d}'), // group 3
    (6, 1, '[C]', '{e}'); // group 3

異なる結果を生成します

VALUES
    (0, 1, '[A]', '{a}'),
    (1, 2, '[B]', '{b}'),
    (2, 2, '[B]', '{c}'),
    (3, 1, '[C]', '{e}'), //group 3
    (4, 1, '[D]', '{d}'), // group 4
    (5, 1, '[E]', '{d}'), // group 4
    (6, 1, '[C]', '{d}'); // group 3

これは、指定できる参照に自然な順序がある場合に意図されている可能性がありますが、そうでない場合は問題になります。これを「解決」するか、別の問題を指定する方法は、すべての等しいReference1が、メンバーがそれ自体である要素のセットと、Reference2がそのセットの少なくとも1つのメンバーに等しい要素のセットを作成すると言うことです。

SQLの場合:

with groupings as (
  select
    ID,Reference1,Reference2,
    (select min(ID) from Table1 t2
     where t2.Reference1=t1.Reference1 or t2.Reference2=t1.Reference2 ) as minID
  from
    Table1 t1
)
select
    t1.ID,t1.Reference1,t1.Reference2,t1.minid as round1,
    (select min(t2.minid) from
            groupings t2
      INNER JOIN groupings t3 ON t1.Reference2=t2.Reference2
) as minID
  from
    groupings t1

これにより、毎回完全なグループ化が生成されます。

于 2012-04-30T23:07:32.507 に答える