SQL查询以在一组语句中查找最大值[重复]
Posted
技术标签:
【中文标题】SQL查询以在一组语句中查找最大值[重复]【英文标题】:SQL query to find max in a group by statement [duplicate] 【发布时间】:2020-10-25 15:19:57 【问题描述】:我有两张桌子,Customers 和 Lodgements。 PK c.customer_ID。 PK l.lodgement_Num,FK l.customer_ID。
我需要创建一个查询,显示 c.customer_fname、c.customer_sname 和总提交金额最高的客户提交的总金额(客户已提交多次)。
我的尝试:
SELECT c.customer_fname, c.customer_sname, MAX(SUM(l.lodgement_amount)) AS
highest_total_lodgements
FROM Customers c INNER JOIN Lodgements l
ON c.customer_ID = l.customer_ID
GROUP BY c.customer_fname, c.customer_sname;
【问题讨论】:
mysql 还是 Oracle?请仅标记一个数据库。 【参考方案1】:您似乎只想要一排,即拥有最多“住宿”的客户:如果是这样,只需 ORDER BY
和 LIMIT
:
SELECT c.customer_fname, c.customer_sname, SUM(l.lodgement_amount) AS lodgement_amount
FROM Customers c
INNER JOIN Lodgements l ON c.customer_ID = l.customer_ID
GROUP BY c.customer_id, c.customer_fname, c.customer_sname
ORDER BY lodgement_amount DESC
LIMIT 1
请注意,我在GROUP BY
子句中添加了客户的id;如果您有两个同名的不同客户,这样会更安全。
行限制语法因数据库而异。以上适用于MySQL。在 Oracle 开始版本 12 中,您可以使用 fetch
子句:
ORDER BY lodgement_amount DESC
FETCH FIRST 1 ROW ONLY
如果您想允许领带关系,那就有点不同了。在 Oracle 中,使用:
ORDER BY lodgement_amount DESC
FETCH FIRST 1 ROW WITH TIES
另一种方法是使用窗口函数:
SELECT *
FROM (
SELECT c.customer_fname, c.customer_sname, SUM(l.lodgement_amount) AS lodgement_amount,
RANK() OVER(ORDER BY SUM(l.lodgement_amount) DESC) rn
FROM Customers c
INNER JOIN Lodgements l ON c.customer_ID = l.customer_ID
GROUP BY c.customer_id, c.customer_fname, c.customer_sname
) t
WHERE rn = 1
【讨论】:
哇,谢谢,信息量很大,这个解决方案非常有效。以上是关于SQL查询以在一组语句中查找最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章