2013-01-08 113 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分区,日期)将返回第一次出现的最大值。 –