PostgreSQL如何查询指定时间段内订单总金额最高的企业CustAccount
需求说明
查询指定时间段内订单累计总金额最高的企业,返回对应企业的CustAccount字段,统计维度为时间段内所有订单的累计金额,而非单笔订单的最大金额。
原有SQL错误点
- 子查询嵌套逻辑混乱,聚合函数
SUM、MAX的使用位置不符合SQL语法规范 - 分组逻辑错误,同时按
CustAccount和Amount分组,无法统计单个企业的累计金额 - 排序字段使用单笔订单金额
Amount,而非累计金额,和需求不符
正确SQL实现
常规实现(仅返回1条最高记录)
适用于MySQL、PostgreSQL等支持LIMIT语法的数据库:
SELECT CustAccount FROM ( -- 先统计每个企业在指定时间段的累计订单金额 SELECT CustAccount, SUM(Amount) AS total_amount FROM CustTrans WHERE TransDate BETWEEN '2000-01-01' AND '2022-01-31' GROUP BY CustAccount ) AS cust_total ORDER BY total_amount DESC LIMIT 1;
提示:如果你的数据库日期存储格式为DD/MM/YYYY,可将WHERE子句中的日期字符串替换为原写法
'01/01/2000'和'31/01/2022'即可。
如果使用SQL Server,将末尾的LIMIT 1替换为TOP 1放在SELECT后面即可;如果使用Oracle,末尾添加FETCH FIRST 1 ROW ONLY即可。
兼容并列最高的实现
如果存在多个企业累计金额同为最高的场景,需要返回所有符合条件的企业,可使用窗口函数实现:
SELECT CustAccount FROM ( SELECT CustAccount, SUM(Amount) AS total_amount, -- 按累计金额倒序排名,金额相同排名一致 RANK() OVER(ORDER BY SUM(Amount) DESC) AS rank_num FROM CustTrans WHERE TransDate BETWEEN '2000-01-01' AND '2022-01-31' GROUP BY CustAccount ) AS cust_rank WHERE rank_num = 1;
内容的提问来源于stack exchange,提问作者Иван Шарыгин
相关产品推荐
相关产品推荐

