sql >> Database teknologi >  >> RDS >> PostgreSQL

Skjul flere rækker af arrays, hvis arrays overlapper

OK, det var hårdt. Tag et kig på denne forespørgsel:

;with recursive minelem AS( select arr, MIN(unnest) minel from (select arr, unnest(arr) from test) a group by arr), testwithrn as( select arr, row_number() over (order by minel) rn from minelem ), cte(arr, rn, counter, grp) as( select arr, rn, 1, 1 from testwithrn where rn = 1 union all select case when array_length(a.arr & b.arr, 1) > 0 then a.arr | b.arr else b.arr end, b.rn, case when array_length(a.arr & b.arr, 1) > 0 then a.counter + 1 else 1 end, case when array_length(a.arr & b.arr, 1) > 0 then a.grp else a.grp + 1 end from cte a inner join testwithrn b on b.rn > a.rn ), grouped as( SELECT arr, counter, grp, row_number() over (partition by grp order by counter desc) rn from cte) select distinct arr from grouped where rn = 1

SQL Fiddle

Du kan teste forskellige CTE'er i forespørgslen ovenfor for at forstå, hvordan jeg er kommet frem til løsningen. Nøglen her er at bruge operator | at flette arrays, som i a.arr | b.arr

Der er en rekursiv forespørgsel kaldet cte der tæller forekomsten af ​​hvert sæt inden for forskellige grupper af sæt. Du kan erstatte den sidste linje for at select * from cte order by grp, counter for at se, hvordan counter og grp ændres, når sættene er rekursivt bygget




  1. Oracle 'printf' ækvivalent

  2. Sådan bestemmes den autogenererede primærnøgle, der bruges som fremmednøgle til en anden tabel

  3. Hvordan opretter du en gennemsnitlig tidsforskel mellem poster i MySQL?

  4. Mysql Query-problemer ved hjælp af LIKE og apostrof