web-dev-qa-db-ja.com

MAX値を持つレコードの選択

SQL Server 2008には、テーブル[〜#〜] customers [〜#〜]があり、次の2つの列があります。

ID、BALANCE

最も効果的な方法で」という最大残高を持つ顧客のIDを選択するクエリを作成するにはどうすればよいですか?

オプション1:ORDER BY BALANCE and SELECT TOP(1)->コストが高すぎます。

オプション2:最初にGet MAX amountを選択してから、where clauseの金額を使用する別のクエリを作成します。

37
Ahmet Altun

:この回答の誤ったリビジョンが編集されました。すべての回答を確認してください。

すべての行で集計された最大のWHEREを取得するためのBALANCE句の副選択。複数のID値がその残高値を共有する場合、すべてが返されます。

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

各顧客に複数のレコードがあり、それぞれの最新の残高を探している場合のオプションは次のとおりです(日付レコードである場合など)。

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
10
Gary

コストがかかりすぎるとはどういう意味ですか?何が多すぎる?

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

テーブルのインデックスが適切に作成されており(バランス)、PKにインデックスを作成する必要がある場合は、コストについてどういう意味かわからないか、信頼できないと思われますか?使用し、実行するよう指示している集計については、信頼できないものはありません。この場合、MAX()は、ユーザーが指示したとおりに実行します。魔法のようなことは何もありません。

MAX()を見てください。フィルタリングしたい場合は、HAVING句を使用してください。

7
JonH

ユーザーの場合、日付ごとに改訂があるとします。以下は、各従業員の各日付の最大改訂の記録を取得します。

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
2
sandip giri

クエリ 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 
)
1
Edinson Serrano