选择具有MAX值的记录

时间:2011-12-05 15:22:47

标签: tsql aggregate-functions

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

ID, BALANCE

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

选项1:ORDER BY BALANCE and SELECT TOP(1) - >费用太高了。

选项2:首先Get MAX amount,然后创建另一个使用where clause中的金额的查询 - >费用太高而且看起来不太可靠。

5 个答案:

答案 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 
)