[英]SQL returning multiple max value rows?
我有一张价格表,想退回在商品上花费最多的客户。 我的查询有效,但如果我有多个客户花费相同的金额(最大),它不会显示他们两个,而只显示一个。
查询如下:
SELECT u.FirstName,u.LastName,CustomerMail,max(Amount) from
(select CustomerMail, sum(Price) as Amount from Ticket
group by CustomerMail),User u where CustomerMail = u.Email;
有谁知道我如何才能退回所有客户,以防万一有多个客户花费了完全相同的金额?
提前致谢!
使用RANK()
窗口函数:
select FirstName, LastName, Email, amount
from (
select u.FirstName, u.LastName, u.Email, sum(t.Price) amount,
rank() over (order by sum(t.Price) desc) rn
from User u inner join Ticket t
on t.CustomerMail = u.Email
group by u.FirstName, u.LastName, u.Email
)
where rn = 1
RANK()
将按降序为每个总和分配一个数字,如果 2 个或多个总和相等,它们将被分配相同的数字。
所以最后你需要的是 rank = 1 的总和。
关于 SQL,您应该了解以下几点:
JOIN
的使用。GROUP BY
。通过在外部查询中混合聚合函数和未聚合列,您正在 SQLite 中使用“扩展功能”。 在几乎所有其他数据库中,这将是一个损坏的、语法错误的查询。
解决问题的规范方法使用窗口函数:
select u.FirstName, u.LastName, CustomerMail, sum_Amount
from (select t.CustomerMail, sum(t.Price) as sum_Amount,
rank() over (order by sum(t.Price) desc) as seqnum
from Ticket t
group by t.CustomerMail
) c join
User u
ON t.CustomerMail = u.Email
where seqnum = 1;
如果您在出现平局时只需要一行,那么您可以使用row_number()
而不是rank()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.