0

注文表があります。そこで、どの3つのpartner_idがamount_totalsの合計を最大にしたかを調べ、それら3つを最大から最小に並べ替える必要があります。

    testdb=# SELECT amount_total, partner_id FROM sale_order;
     amount_total | partner_id 
    --------------+------------
          1244.00 |          9
          3065.90 |         12
          3600.00 |          3
          2263.00 |         25
          3000.00 |         10
          3263.00 |          3
           123.00 |         25
          5400.00 |         12
    (8 rows)

SQLを開始したばかりですが、混乱を招きます...

4

2 に答える 2

1

累計金額

集計された金額を一覧表示する場合は、次のように簡単にできます。

SELECT partner_id, sum(amount_total) AS amout_suptertotal
FROM   sale_order
GROUP  BY 1
ORDER  BY 2 DESC
LIMIT  3;

1 inは、リストGROUP BY 1内の位置を参照する数値パラメーターです。この場合SELECTの表記上のショートカットです。GROUP BY partner_id

これは、3 人以上のパートナーが資格を得る特別なケースを無視し、(定義がないため) 任意に 3 つを選択します。

個別金額

SELECT partner_id, amount_total
FROM   sale_order
JOIN  (
   SELECT partner_id, rank() OVER (ORDER BY sum(amount) DESC) As rnk
   FROM   sale_order
   GROUP  BY 1
   ORDER  BY 2
   LIMIT  3
   ) top3 USING (partner_id)
ORDER  BY top3.rnk;

一方、これには、3 つ以上のパートナーがトップ 3 の資格がある場合、すべてのピアが含まれます。ウィンドウ関数rank()がそれを提供します。

ここでの手法はpartner_id、サブクエリtop3でグループ化し、集計後にウィンドウ関数rank()にランクをアタッチさせることです (ウィンドウ関数は集計関数の後に実行されます)。 ORDER BYウィンドウ関数の後に適用され、LIMIT最後に適用されます。すべて 1 つのサブクエリで。

次に、ベース テーブルをこのサブクエリに結合して、上位の犬だけが結果に残り、次の順序で並べ替えrnkます。

ウィンドウ関数には PostgreSQL 8.4 以降が必要です。

これはかなり高度なものです。おそらくもっと単純なものから SQL の学習を開始する必要があります。

于 2013-03-21T02:27:35.223 に答える
1
select amount_total, partner_id
from (
    select
        sum(amount_total) amount_total,
        partner_id
    from sale_order
    group by partner_id
) s
order by amount_total desc
limit 3
于 2013-03-20T23:30:59.590 に答える