立即汇总和订购

时间:2013-03-20 23:22:10

标签: sql postgresql aggregate-functions greatest-n-per-group

我有一张订单表。在那里,我需要找出哪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,我发现它令人困惑......

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

汇总金额

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

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

GROUP BY 1中的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名,那么这一个包括所有同伴。window function rank()为您提供。

这里的技术是在子查询partner_id中按top3进行分组,并使窗口函数rank()在聚合之后附加排名(窗口函数在聚合函数之后执行)。窗口函数后应用ORDER BY,最后应用LIMIT。所有在一个子查询。

然后我将基表连接到此子查询,以便只有顶级狗保留在结果中并按rnk排序。

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

这是相当先进的东西。你应该用更简单的东西开始学习SQL。