SQL Server 2008には、テーブル[〜#〜] customers [〜#〜]があり、次の2つの列があります。
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 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 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
クエリ sandip giriによる回答 は正しい答えでした。ここでは、最大値(Base)を計算した後、最大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
)