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

すべてのグループは、特定のサブグループに対して等しい合計パワーを持っていますか?

    質問を注意深く読んでください

    そして:

    パフォーマンスの重要なポイントは、無関係な行を早期に除外し、指定されたサブグループの集計のみを計算することです。 。次に(いくつかの異なるサブグループを想定)、(subgroup)のインデックス 助けることができます:

    CREATE INDEX ON foo (subgroup);
    

    次の各クエリはFALSEを返します 少なくとも2つのグループが、指定されたサブグループの合計が異なる場合、およびTRUE すべて その他の場合(クエリ5のマイナーな例外を除いて、以下を参照)。

    クエリ1

    SELECT count(DISTINCT total_power) = 1
    FROM  (
       SELECT sum(power) AS total_power
       FROM   foo
       WHERE  subgroup = 'Sub_B'  -- exclude irrelevant rows early!
       GROUP  BY grp
       ) sub;
    

    クエリ2

    SELECT count(*) = 1
    FROM  (
       SELECT true
       FROM  (
          SELECT sum(power) AS total_power
          FROM   foo
          WHERE  subgroup = 'Sub_C'
          GROUP  BY grp
          ) sub2
       GROUP  BY total_power
       ) sub2;
    

    クエリ3

    SELECT count(*) OVER () = 1
    FROM  (
       SELECT sum(power) AS total_power
       FROM   foo
       WHERE  subgroup = 'Sub_A'
       GROUP  BY grp
       ) sub
    GROUP  BY total_power
    LIMIT  1;
    

    クエリ4

    (
    SELECT FALSE
    FROM  (
       SELECT sum(power) AS total_power
       FROM   foo
       WHERE  subgroup = 'Sub_A'
       GROUP  BY grp
       ) sub
    GROUP  BY total_power
    OFFSET 1
    LIMIT  1
    )
    UNION ALL
    SELECT TRUE
    LIMIT 1;
    

    これは特別です。説明付きの関連回答:

    クエリ5

    SELECT min(total_power) = max(total_power)  -- can fail for NULL values
    FROM  (
       SELECT sum(power) AS total_power
       FROM   foo
       WHERE  subgroup = 'Sub_A'
       GROUP  BY grp
       ) sub;
    

    NULLの場合、最後は失敗する可能性があります 電力の値が許可されます。 (ただし、この場合、とにかく期待される結果を定義する必要があります。)

    広範なテストを実行しました そして、すべてのクエリが理想的な条件下でほぼ同じように実行されることを発見しました:

    db <> fiddle こちら

    クエリ5は、他のクエリよりも少し速い傾向がありました。



    1. MySQLクエリがデータベーステーブルデータの変更に成功したかどうかをテストするにはどうすればよいですか?

    2. パーティションスイッチングを使用した中断の少ないSQLServerテーブルの更新

    3. ユーザー定義変数を使用した列エイリアスの指定

    4. 暗号化せずにAPIのパスワードを安全に保存する