sql >> Databáze >  >> RDS >> PostgreSQL

Pokud se pole překrývají, sbalte více řádků polí

Dobře, bylo to těžké. Podívejte se prosím na tento dotaz:

;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

Ve výše uvedeném dotazu můžete otestovat různé CTE, abyste pochopili, jak jsem přišel s řešením. Klíčem je zde použít operátor | ke sloučení polí, jako v a.arr | b.arr

Existuje rekurzivní dotaz nazvaný cte který počítá výskyt každé množiny v rámci různých skupin množin. Poslední řádek můžete nahradit select * from cte order by grp, counter abyste viděli, jak counter a grp se změní, když jsou sady rekurzivně sestaveny




  1. Jak vybrat seskupené záznamy pouze v případě, že každý záznam ve skupině splňuje určitá kritéria v MySQL?

  2. MySQL - Vypočítat čistý časový rozdíl mezi dvěma daty a časy bez přestávek?

  3. Jaký je doporučený způsob připojení k MySQL z Go?

  4. Odkazování na alias sloupce v klauzuli WHERE