sql >> Databasteknik >  >> RDS >> Oracle

Flagga personer som delar gemensamma funktioner med Oracle SQL

Här är ett sätt att göra detta, med hjälp av en hierarkisk ("anslut med") fråga. Det första steget är att extrahera de initiala relationerna från basdata; den hierarkiska frågan bygger på resultatet från detta första steg. Jag lade till ytterligare en rad till ingångarna för att illustrera en nod som är en ansluten komponent i sig själv.

Du har markerat de anslutna komponenterna som A och B - det fungerar naturligtvis inte om du har t.ex. 30 000 anslutna komponenter. I min lösning använder jag det minsta nodnamnet som markör för varje ansluten komponent.

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
;

Utdata:

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

Sedan, om du behöver lägga till ID_GROUP som en FLAG till basdata, kan du göra det med en trivial join.




  1. Hur räknar man på varandra följande dubbletter i en tabell?

  2. UPPDATERA och ERSÄTT del av en sträng

  3. SQL Hämta alla poster äldre än 30 dagar

  4. Exekvera en Oracle-lagrad procedur inom EntityFramework