在SQL Server 2008中我有一個表客戶有兩列:選擇錄製最大值
ID, BALANCE
我怎麼能寫選擇ID查詢有最大餘額的客戶,「以最有效的方式」?
選項1:ORDER BY BALANCE and SELECT TOP(1)
- >成本太高。選項2:首先Get MAX amount
,然後再使用where clause
中的金額進行另一個查詢 - >成本太高,而且看起來不可靠。
在SQL Server 2008中我有一個表客戶有兩列:選擇錄製最大值
ID, BALANCE
我怎麼能寫選擇ID查詢有最大餘額的客戶,「以最有效的方式」?
選項1:ORDER BY BALANCE and SELECT TOP(1)
- >成本太高。選項2:首先Get MAX amount
,然後再使用where clause
中的金額進行另一個查詢 - >成本太高,而且看起來不可靠。
注意:編輯了此答案的不正確的修訂版。請查看所有答案。
WHERE
子句中的子查詢檢索彙總在所有行上的最大BALANCE
。如果多個ID
值共享該餘額值,則將返回所有值。
SELECT
ID,
BALANCE
FROM CUSTOMERS
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS)
你的意思是什麼成本太多?太多了?
SELECT MAX(Balance) AS MaxBalance, CustomerID FROM CUSTOMERS GROUP BY CustomerID
如果你的表是正確索引(平衡),而且一定是在PK的索引比我不知道你的意思大概費用過多或似乎不可靠,?對於您正在使用的並告訴它執行的聚合,沒有什麼不可靠的。在這種情況下,MAX()
完全符合您的要求 - 沒有什麼不可思議的。
查看MAX()
,如果要過濾則使用HAVING
子句。
對於用戶來說,每個日期都有修訂。以下內容將記錄每個員工每個日期的最大修訂。
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
查詢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
)
下面是一個選項,如果你有多個記錄爲每個客戶,並正在尋找每個最新的餘額(說,他們是過時的記錄):
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
這是簡單的方法來獲得客戶與最大餘額:
SELECT
ID,
BALANCE
FROM CUSTOMERS
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS)
如果您添加一個非聚集索引餘額,你應該發現,選項1更快。 – StuartLC
您是否想在領帶事件中知道所有ID?看起來你正在尋找一個隨機的,如果是平局的話。 – Gary