Sql 多个最大行

Sql 多个最大行,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我需要写一个查询,确定每个国家在音乐上花费最多的客户。编写一个查询,返回国家、顶级客户以及他们花费了多少。对于共享最高消费金额的国家/地区,请提供花费此金额的所有客户 您应该只需要使用Customer和Invoice表 检查您的解决方案 虽然只有24个国家,但您的查询应该返回25行,因为英国有2个客户共享最大值 我构建了查询,但是有一个组有两个最大的结果我必须显示 SELECT CustomerId , FirstName, LastName, Country, MAX(TotalSpent)

我需要写一个查询,确定每个国家在音乐上花费最多的客户。编写一个查询,返回国家、顶级客户以及他们花费了多少。对于共享最高消费金额的国家/地区,请提供花费此金额的所有客户

您应该只需要使用Customer和Invoice表

检查您的解决方案

虽然只有24个国家,但您的查询应该返回25行,因为英国有2个客户共享最大值

我构建了查询,但是有一个组有两个最大的结果我必须显示

SELECT CustomerId , FirstName, LastName, Country, MAX(TotalSpent) AS  TotalSpent 
from  (select c.CustomerId as CustomerId, c.Firstname As FirstName,  c.LastName as LastName, i.BillingCountry as Country, SUM(i.Total) as TotalSpent
from customer c join invoice i
on c.CustomerId = i.CustomerId
   group by 1,2,3,4
   order by 5 desc
   limit by 1 ) AS temp
   group by 4
预期结果必须是25行,而不是24行
英国有两个客户共享相同金额的最大消费金额

以下脚本将帮助您获得所需的结果。我在脚本中使用RANK来选择一个或多个客户,每个国家发送的最大金额

    WITH Customer(CustomerId,FirstName,LastName)
AS
(
    SELECT 1, '1 FN', '1 LN' UNION ALL
    SELECT 2, '2 FN', '2 LN'
),
Invoice(CustomerId,Country,Total)
AS
(
    SELECT 1, 'C 1', 100 UNION ALL
    SELECT 1, 'C 1', 35 UNION ALL
    SELECT 2, 'C 1', 80 UNION ALL
    SELECT 2, 'C 1', 80 UNION ALL
    SELECT 1, 'C 2', 50 UNION ALL   
    SELECT 2, 'C 2', 100 UNION ALL
    SELECT 1, 'C 2', 50 UNION ALL
    SELECT 1, 'C 3', 17 UNION ALL   
    SELECT 2, 'C 3', 17
)

SELECT 
    B.Country, 
    B.CustomerId, 
    C.FirstName, 
    C.LastName, 
    B.T AS TotalSpent
FROM
(
    SELECT *, 
           RANK() OVER(PARTITION BY Country
           ORDER BY Country, 
                    T DESC) RN
    FROM
    (
        SELECT i.Country, 
               C.CustomerId, 
               SUM(i.Total) T
        FROM Customer C
             INNER JOIN Invoice I ON c.CustomerId = i.CustomerId
        GROUP BY i.Country, 
                 C.CustomerId
    ) A
) B
INNER JOIN Customer C ON B.CustomerId = C.CustomerId
WHERE B.RN = 1
ORDER BY 1,2
输出为(考虑CTE输入)-


您正在使用哪些RDBMS?另外,不要像那样按顺序值排序/分组。@dfundako SQL Server这是一个问题,在堆栈溢出时经常出现这个问题。许多解决方案都遵循这个标签。在SQL Server中,您可以使用窗口函数
ROW_NUMBER()
@BillKarwin谢谢您,但我需要使用mutli select或join来完成,而不是使用内置函数这是一个荒谬的要求,但您可以这样做,例如,请参见我使用左外连接的解决方案:这个问题是关于MySQL的,但是join解决方案可以在任何品牌的SQL数据库中使用。Opps!!连接后应施加的条件。已编辑。:(我的脚本没有任何问题。添加了一些CTE代码,以便您可以检查自己。
Country   CustomerId    FirstName   LastName    TotalSpent
C 1       2             2 FN        2 LN        160
C 2       1             1 FN        1 LN        100
C 2       2             2 FN        2 LN        100
C 3       1             1 FN        1 LN        17
C 3       2             2 FN        2 LN        17