选择具有MAX值的记录

Ahm*_*tun 41 t-sql aggregate-functions

在SQL Server 2008中,我有一个表CUSTOMERS,它有两列:

身份证,资产负债表

如何以最有效的方式编写选择具有最大余额的客户ID的查询?

选项1:ORDER BY BALANCE and SELECT TOP(1)- >成本太高.

选项2:首先Get MAX amount,然后进行另一个查询,使用where clause- >成本太多而且看起来不可靠.

Mic*_*ski 65

注意:修改了此答案的错误修订版.请查看所有答案.

WHERE子句中的子选择,用于检索BALANCE所有行的最大聚合.如果多个ID值共享该余额值,则将返回所有值.

SELECT 
  ID,
  BALANCE
FROM CUSTOMERS
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS)
Run Code Online (Sandbox Code Playgroud)

  • @SergeProfafilecebook奇怪 - 我想知道为什么这么多年前这个答案被接受了.在`HAVING`或`WHERE`中应该有一个子查询. (5认同)
  • BALANCE列在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY子句中. (4认同)

Gar*_*ary 12

如果您为每个客户提供多条记录并且正在为每个客户寻找最新余额(例如它们是过时记录),则可以选择以下选项:

SELECT ID, BALANCE FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DateModified DESC) as RowNum, ID, BALANCE
    FROM CUSTOMERS
) C
WHERE RowNum = 1
Run Code Online (Sandbox Code Playgroud)

  • 这是很好的语法,但我注意到在选择更大的数据集时,“SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DateModified DESC)”的性能确实非常影响 (3认同)
  • 干杯,这就是我想要的。 (2认同)

Jon*_*onH 7

你的意思是什么?太多了什么?

SELECT MAX(Balance) AS MaxBalance, CustomerID FROM CUSTOMERS GROUP BY CustomerID

如果你的表被正确编入索引(平衡)并且必须有一个关于PK的索引,那么我不确定你对成本的意义是什么,或者看起来不可靠?你使用并告诉它要做的聚合没有什么不可靠的.在这种情况下,MAX()确切地告诉你它做什么 - 它没有什么神奇之处.

看看,MAX()如果你想过滤它,请使用该HAVING子句.