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)
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 MAX(Balance) AS MaxBalance, CustomerID FROM CUSTOMERS GROUP BY CustomerID
如果你的表被正确编入索引(平衡)并且必须有一个关于PK的索引,那么我不确定你对成本的意义是什么,或者看起来不可靠?你使用并告诉它要做的聚合没有什么不可靠的.在这种情况下,MAX()确切地告诉你它做什么 - 它没有什么神奇之处.
看看,MAX()如果你想过滤它,请使用该HAVING子句.