Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kennzeichnen Sie Personen, die gemeinsame Funktionen mit Oracle SQL teilen

Hier ist eine Möglichkeit, dies zu tun, indem eine hierarchische Abfrage ("Verbinden durch") verwendet wird. Der erste Schritt besteht darin, die anfänglichen Beziehungen aus den Basisdaten zu extrahieren; die hierarchische Abfrage baut auf dem Ergebnis dieses ersten Schritts auf. Ich habe den Eingaben eine weitere Zeile hinzugefügt, um einen Knoten zu veranschaulichen, der selbst eine verbundene Komponente ist.

Sie haben die verbundenen Komponenten als A und B markiert - das funktioniert natürlich nicht, wenn Sie beispielsweise 30.000 verbundene Komponenten haben. In meiner Lösung verwende ich den minimalen Knotennamen als Markierung für jede verbundene Komponente.

with
  sample_data (id, feature) as (
    select 1,  1 from dual union all
    select 1,  2 from dual union all
    select 1,  3 from dual union all
    select 2,  3 from dual union all
    select 2,  4 from dual union all
    select 2,  6 from dual union all
    select 3,  5 from dual union all
    select 3, 10 from dual union all
    select 3, 12 from dual union all
    select 4, 12 from dual union all
    select 4, 18 from dual union all
    select 5, 10 from dual union all
    select 5, 30 from dual union all
    select 6, 40 from dual
  )
-- select * from sample_data; /*
, initial_rel(id_base, id_linked) as (
    select distinct s1.id, s2.id
      from sample_data s1 join sample_data s2
                          on s1.feature = s2.feature and s1.id <= s2.id
  )
-- select * from initial_rel; /*
select     id_linked as id, min(connect_by_root(id_base)) as id_group
from       initial_rel
start with id_base <= id_linked
connect by nocycle prior id_linked = id_base and id_base < id_linked
group by   id_linked
order by   id_group, id
;

Ausgabe:

     ID   ID_GROUP
------- ----------
      1          1
      2          1
      3          3
      4          3
      5          3
      6          6

Wenn Sie dann die ID_GROUP als FLAG zu den Basisdaten hinzufügen müssen, können Sie dies mit einem trivialen Join tun.