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