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

非常に単純なクエリでHAVINGとWHEREの組み合わせに問題がある

    PostgreSQLのバックグラウンドはありませんが、これが機能するかどうかを確認します。

    これを単純化することから始めます。最初にプレーヤーごとの合計スコアを返すクエリを記述します。

    SELECT player_id, SUM(score) score
    FROM (
      SELECT first_player as player_id, first_score as score
      FROM matches
      UNION ALL
      SELECT second_player, second_score
      FROM matches
    )
    GROUP BY player_id
    

    次に、そのデータセットをプレーヤーに参加させて、グループを見つけます。

    SELECT w.player_id, p.group_id, w.score
    FROM
    (
      SELECT player_id, SUM(score) score
      FROM (
        SELECT first_player as player_id, first_score as score
        FROM matches
        UNION ALL
        SELECT second_player, second_score
        FROM matches
      )
      GROUP BY player_id
    ) as w
    inner join players p
    on p.player_id = w.player_id
    

    これで、すべてのプレーヤー、合計スコア、およびグループができました。グループごとに勝者を特定したいですか? ランキング を使用できます これを行うための関数:

    SELECT 
    w.player_id, 
    p.group_id, 
    w.score, 
    RANK() OVER (PARTITION BY p.group_id ORDER BY score DESC) as group_placement
    FROM
    (
      SELECT player_id, SUM(score) score
      FROM (
        SELECT first_player as player_id, first_score as score
        FROM matches
        UNION ALL
        SELECT second_player, second_score
        FROM matches
      )
      GROUP BY player_id
    ) as w
    inner join players p
    on p.player_id = w.player_id
    

    ここで、WHEREを使用して、各グループ(ランク=1)の上位のものを選択します。

      SELECT 
      player_id, 
      group_id
      FROM
      (
          SELECT 
          w.player_id, 
          p.group_id, 
          w.score, 
          RANK() OVER (PARTITION BY p.group_id ORDER BY score DESC) as group_placement
          FROM
          (
            SELECT player_id, SUM(score) score
            FROM (
              SELECT first_player as player_id, first_score as score
              FROM matches
              UNION ALL
              SELECT second_player, second_score
              FROM matches
            )
            GROUP BY player_id
          ) as w
          inner join players p
          on p.player_id = w.player_id
        ) as gp
        WHERE group_placement = 1
    

    複雑に見えますか?はい。ただし、最終結果が少しずつ提供されていることがわかります。この各ステップは「サブテーブル」であり、各ポイントでデータを実行および監視できます。




    1. SQLコマンドで使用される特別な要素の不適切な中和

    2. 定数を使用してMySQLのクエリを最適化するにはどうすればよいですか?

    3. PostgreSQLトランザクション内でリアルタイムを取得するにはどうすればよいですか?

    4. SQL Serverのキリル文字で'?????'を書く