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

SQLの最適化が必要です(おそらくDISTINCT ONが理由ですか?)

    多次元配列の集計関数

    2次元配列を作成すると思います そのために。これは、ARRAY of recordよりも処理が簡単です。 。標準のarray_agg() 多次元配列を集約することはできません。ただし、そのために独自の集計関数をかなり簡単に作成できます。

    CREATE AGGREGATE array_agg_mult (anyarray)  (
        SFUNC     = array_cat
       ,STYPE     = anyarray
       ,INITCOND  = '{}'
    );
    

    この関連する回答の説明を読んでください:
    Postgres配列へのデータの選択

    クエリ

    SELECT DISTINCT ON (p)
           p, groundtruth, array_agg_mult(ARRAY[ARRAY[anchor_id, id]]) AS ids
    FROM (
       SELECT DISTINCT ON (ps.p, m.groundtruth, m.anchor_id)
              ps.p, m.groundtruth, m.anchor_id, m.id
       FROM  (SELECT unnest(point_array) AS p) AS ps
       JOIN   measurement m ON ST_DWithin(ps.p, m.groundtruth, distance)
       ORDER  BY ps.p, m.groundtruth, m.anchor_id, random()
       ) x
    GROUP  BY p, groundtruth
    ORDER  BY p, random();
    
    • サブクエリx 個別のanchor_idを取得します (p, groundtruth)ごと 複数のピアがある場合は、ランダムな行を選択します。このようにして、接続anchor_id - id そのまま残ります。

    • 外側のクエリは、anchor_idの順序で、希望どおりに2次元配列を集約します。 。 anchor_idが必要な場合 ランダムに注文し、もう一度ランダムを使用します:

      array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
      
    • そして最後に、DISTINCT ON 1つのgroundtruthのみを選択します pごと 、再びランダムに。




    1. データベース内の値を検索するための最良の方法

    2. MySQLネストクエリ選択ステートメント

    3. 集計で異なる値を表示する

    4. MariaDB10.4の新機能