繁体   English   中英

SQL 返回多个最大值行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM