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

サブクエリを使用しないPostgreSQLの合計に対する割合

    サブクエリを削除する理由は、usersテーブルを2回スキャンしないようにするためだと思います。合計は各国のカウントの合計であることを忘れないでください。

    WITH c AS (
      SELECT
        country_id,
        count(*) AS cnt
      FROM users
      WHERE cond1=...
      GROUP BY country_id
    ) 
    SELECT
      *,
      100.0 * cnt / (SELECT sum(cnt) FROM c) AS percent
    FROM c;
    

    このクエリは、国ごとの統計を使用して小さなCTEを構築します。ユーザーテーブルを1回だけスキャンし、小さな結果セットを生成します(国ごとに1行のみ)。

    合計(SELECT sum(cnt)FROM c)は、この小さな結果セットで1回だけ計算されるため、使用する時間はごくわずかです。

    ウィンドウ関数を使用することもできます:

    SELECT
      country_id,
      cnt,
      100.0 * cnt / (sum(cnt) OVER ()) AS percent 
    FROM (
      SELECT country_id, count(*) as cnt from users group by country_id
    ) foo;
    

    (これは、エラーが削除されたナイトウルフのクエリと同じですlol)

    両方のクエリにほぼ同じ時間がかかります。



    1. MySQL:複数のファイルをテーブルにロードする

    2. SQL エージェント ジョブ - 実行者ドロップダウン リストが空です

    3. OracleBLOBデータ型からRichTextBoxへ

    4. 日付に基づいてテーブルからデータを選択する