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

結合されたテーブル列の個別の合計を取得します

    サブクエリなしで結果を取得するには 、高度なウィンドウ関数のトリックに頼る必要があります:

    SELECT sum(count(*))       OVER () AS tickets_count
         , sum(min(a.revenue)) OVER () AS atendees_revenue
    FROM   tickets   t
    JOIN   attendees a ON a.id = t.attendee_id
    GROUP  BY t.attendee_id
    LIMIT  1;
    

    sqlfiddle

    どのように機能しますか?

    これを理解するための鍵は、一連のイベントです。 クエリ内:

    集計関数->ウィンドウ関数->DISTINCT->LIMIT

    詳細:

    • LIMITが適用される前に結果カウントを取得するための最良の方法

    ステップバイステップ:

    1. GROUP BY t.attendee_id -これは通常、サブクエリで行います。

    2. 次に、カウントを合計して、チケットの総数を取得します。あまり効率的ではありませんが、要件によって強制されます。集計関数count(*) ウィンドウ関数sum( ... ) OVER ()でラップされます あまり一般的ではない式に到達するには:sum(count(*)) OVER ()

      そして、参加者1人あたりの最小収益を合計して、重複のない合計を取得します。

      max()を使用することもできます またはavg() min()の代わりに revenueと同じ効果があります 参加者ごとにすべての行で同じであることが保証されています。

      DISTINCTの場合、これはより簡単になる可能性があります ウィンドウ関数で許可されていましたが、PostgreSQLは(まだ)この機能を実装していません。ドキュメントごと:

      集計ウィンドウ関数は、通常の集計関数とは異なり、DISTINCTを許可しません またはORDER BY 関数の引数リスト内で使用されます。

    3. 最後のステップは、単一の行を取得することです。これはDISTINCTで行うことができます (SQL標準)すべての行が同じであるため。 LIMIT 1 ただし、高速になります。または、SQL標準形式のFETCH FIRST 1 ROWS ONLY



    1. MySQLとNoSQL:適切なものを選択するのを手伝ってください

    2. PHP、MySQLエラー:列数が行1の値数と一致しません

    3. PostgreSQL高可用性インストールPatroni

    4. CALライセンスに基づくSQLServer2012EnterpriseEditionのパフォーマンスの問題