在SQL Server 2008中,我有一个表 CUSTOMERS ,它有两列:
ID, BALANCE
如何编写选择具有最大余额的客户ID的查询,“以最有效的方式”?
选项1:ORDER BY BALANCE and SELECT TOP(1)
- >费用太高了。
选项2:首先Get MAX amount
,然后创建另一个使用where clause
中的金额的查询 - >费用太高而且看起来不太可靠。
答案 0 :(得分:58)
注意:修改了此答案的错误修订版。请查看所有答案。
WHERE
子句中的子选择,用于检索在所有行上聚合的最大BALANCE
。如果多个ID
值共享该余额值,则会返回所有值。
SELECT
ID,
BALANCE
FROM CUSTOMERS
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS)
答案 1 :(得分:7)
你的意思是什么?太多了什么?
SELECT MAX(Balance) AS MaxBalance, CustomerID FROM CUSTOMERS GROUP BY CustomerID
如果您的表格被正确编入索引(余额)并且必须有一个关于PK的索引,那么我不确定您对成本的意义是什么,或者看起来不可靠?你使用并告诉它要做的聚合没有什么不可靠的。在这种情况下,MAX()
完全按照你的要求去做 - 没有什么神奇之处。
查看MAX()
,如果要过滤它,请使用HAVING
子句。
答案 2 :(得分:7)
如果您为每位客户提供多条记录并且正在寻找每种客户的最新余额(例如,它们是注明日期的记录),则可以选择以下选项:
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
答案 3 :(得分:2)
说,对于用户,每个日期都有修订版。以下内容将为每位员工提供每个日期的最大修订记录。
select job, adate, rev, usr, typ
from tbl
where exists ( select 1 from ( select usr, adate, max(rev) as max_rev
from tbl
group by usr, adate
) as cond
where tbl.usr=cond.usr
and tbl.adate =cond.adate
and tbl.rev =cond.max_rev
)
order by adate, job, usr
答案 4 :(得分:1)
查询answered by sandip giri是正确的答案,这里是一个类似的例子,在计算出最大值(基数)后得到最大id(PresupuestoEtapaActividadHistoricoId)
select *
from (
select PEAA.PresupuestoEtapaActividadId,
PEAH.PresupuestoEtapaActividadHistoricoId,
sum(PEAA.ValorTotalDesperdicioBase) as Base,
sum(PEAA.ValorTotalDesperdicioEjecucion) as Ejecucion
from hgc.PresupuestoActividadAnalisis as PEAA
inner join hgc.PresupuestoEtapaActividad as PEA
on PEAA.PresupuestoEtapaActividadId = PEA.PresupuestoEtapaActividadId
inner join hgc.PresupuestoEtapaActividadHistorico as PEAH
on PEA.PresupuestoEtapaActividadId = PEAH.PresupuestoEtapaActividadId
group by PEAH.PresupuestoEtapaActividadHistoricoId, PEAA.PresupuestoEtapaActividadId
) as t
where exists (
select 1
from (
select MAX(PEAH.PresupuestoEtapaActividadHistoricoId) as PresupuestoEtapaActividadHistoricoId
from hgc.PresupuestoEtapaActividadHistorico as PEAH
group by PEAH.PresupuestoEtapaActividadId
) as ti
where t.PresupuestoEtapaActividadHistoricoId = ti.PresupuestoEtapaActividadHistoricoId
)