2013-01-08 161 views
1

我有一個表,看起來像這樣(這僅僅是一些記錄和他們也更多的列太多,但這些是我關心的):SQL Server和聚合函數選擇

nbr amt  date  
1  10  10/30/2012 
1  15  1/30/2012 
1  50  11/30/2012 
2  10  4/30/2012 
2  1000 5/30/2012 
2  45  1/15/2012 
4  90  12/30/2012 
4  89  8/30/2012 
3  100  7/30/2012 

我試圖選擇與使用SQL Server 2012的每個nbr的最大值(amt)相對應的nbr,amt和日期。

我有這樣的查詢,它按nbr對它進行分組,並選擇max(amt )但它不會讓我選擇日期,因爲它不在聚合函數中,但如果我把它放在一個聚合函數中,它會選擇max(日期),它不會對amt的實際日期進行修改:

,topamt as (
select 
       nbr 
    ,amt 
    ,date 
,amtrank = row_number() over (partition by ah.member_nbr order by ah.tran_amt desc) 

from HISTORY ah 
     amt>=10 
and id=6061 
and date between '11-01-2012' and '12-31-2012' 

,所以如果我更改查詢到這個我在哪裏定義它抓住最大(AMT)的結果沒有顯示至少應最大。

+0

如果您有兩個不同的日子發生了相同的最高AMT,你會希望你第一次打的量或最近一次襲擊是多少? –

+0

無論哪一個更容易實現 – Jt2ouan

回答

4

嘗試使用排序功能:

with TopAmt as 
(
    select * 
    , amtRank = row_number() over (partition by nbr order by amt desc) 
) 
select nbr 
    , amt 
    , date 
from TopAmt 
where amtRank = 1 
+1

+1,這將始終檢索一條記錄。如果有多個記錄的每個'nbr'具有相同的最大'amt',那麼op可以使用'RANK'而不是'ROW_NUMBER' – Lamak

+0

我不知道這是問題,而是我正在查看的表有超過3列,這些只是我關心的人。我得到的錯誤:nbr指定多次topamt – Jt2ouan

+0

@拉馬克是一個很好的觀點;如果您擔心打破平局,您可以在over條款中加入日期,例如(按nb order by amt desc分區,日期)將返回第一次出現的最大值。 –