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

追加の(個別の)フィルターを使用して列を集約します

    集計FILTER 条項 Postgresで9.4 または新しい方が短くて速い:

    SELECT u.name
         , count(*) FILTER (WHERE g.winner_id  > 0)    AS played
         , count(*) FILTER (WHERE g.winner_id  = u.id) AS won
         , count(*) FILTER (WHERE g.winner_id <> u.id) AS lost
    FROM   games g
    JOIN   users u ON u.id IN (g.player_1_id, g.player_2_id)
    GROUP  BY u.name;
    
    • マニュアル
    • Postgres Wiki
    • Depeszブログ投稿

    Postgresで9.3 (または任意 バージョン)これは、ネストされたサブ選択またはCASEよりもさらに短く高速です。 式:

    SELECT u.name
         , count(g.winner_id  > 0 OR NULL)    AS played
         , count(g.winner_id  = u.id OR NULL) AS won
         , count(g.winner_id <> u.id OR NULL) AS lost
    FROM   games g
    JOIN   users u ON u.id IN (g.player_1_id, g.player_2_id)
    GROUP  BY u.name;
    

    詳細:

    • 絶対的なパフォーマンスのために、SUMは高速ですか、それともCOUNTですか?


    1. SQL接続文字列にカスタム属性を追加するにはどうすればよいですか?

    2. Oracleデータベースの例でのJava

    3. MariaDBでのCONCAT_WS()のしくみ

    4. PostgreSQLを使用して同じクエリの複数の行を更新する