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 BYLIMIT

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查询以在一组语句中查找最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询语句,怎样查询重复数据

结合排序、选择进入和 where 语句以在 oracle sql 中查找最大值

如何用sql 语句查找一个表里的两个字段重复的记录

怎么用sql语句查找从月初到月末的数据

用sql语句,查询每个班级成绩排名前三名的学生姓名

用sql语句,查询每个班级成绩排名前三名的学生姓名