2011-12-05 131 views
24

在SQL Server 2008中我有一個表客戶有兩列:選擇錄製最大值

ID, BALANCE

我怎麼能寫選擇ID查詢有最大餘額的客戶,「以最有效的方式」?

選項1:ORDER BY BALANCE and SELECT TOP(1) - >成本太高。選項2:首先Get MAX amount,然後再使用where clause中的金額進行另一個查詢 - >成本太高,而且看起來不可靠。

+4

如果您添加一個非聚集索引餘額,你應該發現,選項1更快。 – StuartLC

+0

您是否想在領帶事件中知道所有ID?看起來你正在尋找一個隨機的,如果是平局的話。 – Gary

回答

31

注意:編輯了此答案的不正確的修訂版。請查看所有答案。

WHERE子句中的子查詢檢索彙總在所有行上的最大BALANCE。如果多個ID值共享該餘額值,則將返回所有值。

SELECT 
    ID, 
    BALANCE 
FROM CUSTOMERS 
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS) 
+1

我沒有SQL專家,但沒有集團有自己的成本?? – Baz1nga

+0

@ Baz1nga - 如果沒有group by子句,則無法使用附加列處理聚合函數。一切都有成本,但真正的問題是什麼? – JonH

+4

在HAVING子句中,BALANCE列無效,因爲它不包含在聚合函數或GROUP BY子句中。 –

6

你的意思是什麼成本太多?太多了?

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

如果你的表是正確索引(平衡),而且一定是在PK的索引比我不知道你的意思大概費用過多或似乎不可靠,?對於您正在使用的並告訴它執行的聚合,沒有什麼不可靠的。在這種情況下,MAX()完全符合您的要求 - 沒有什麼不可思議的。

查看MAX(),如果要過濾則使用HAVING子句。

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 
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 
     ) 
1

下面是一個選項,如果你有多個記錄爲每個客戶,並正在尋找每個最新的餘額(說,他們是過時的記錄):

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 
0

這是簡單的方法來獲得客戶與最大餘額:

SELECT 
    ID, 
    BALANCE 
FROM CUSTOMERS 
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS)