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 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 回答
1

合计金额

如果要列出汇总金额,可以很简单:

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

1 inGROUP BY 1是一个数字参数,表示SELECT列表中的位置。GROUP BY partner_id在这种情况下只是一个符号快捷方式。

这忽略了超过三个合作伙伴有资格并任意选择 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应用,最后应用。全部在一个子查询中。

然后我将基表加入到这个子查询中,这样结果和 order by 中只剩下排名靠前的狗rnk

窗口函数需要 PostgreSQL 8.4 或更高版本。

这是相当高级的东西。您可能应该从更简单的东西开始学习 SQL。

于 2013-03-21T02:27:35.223 回答