sql >> データベース >  >> RDS >> PostgreSQL

配列が重複している場合は、配列の複数の行を折りたたむ

    OK、大変でした。このクエリをご覧ください:

    ;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フィドル

    上記のクエリでさまざまなCTEをテストして、私がどのように解決策を考え出したかを理解できます。ここで重要なのは、演算子|を使用することです。 a.arr | b.arr

    cteと呼ばれる再帰クエリがあります これは、セットの異なるグループ内の各セットの発生をカウントします。最後の行をselect * from cte order by grp, counterに置き換えることができます counter およびgrp セットが再帰的に構築されると変更されます




    1. 20〜30の同時mysql接続により、RDSが80%を超えて急上昇します

    2. PostgreSQL:特定の時間帯の特定の曜日に発生する行を選択する

    3. PostgreSQLでクロスデータベースクエリを実行することは可能ですか?

    4. リモートサーバー上のmysqldump