DECLARE @t Table(Name Varchar(30),[Year] Int, [Month] Int,Value Int)
Insert Into @t Values('JERRY' , 2012, 9, 100 )
Insert Into @t Values('JERRY', 2012, 9 , 120)
Insert Into @t Values('JERRY' , 2012, 9 , 130)
Insert Into @t Values('JERRY', 2012 , 8 , 20)
Insert Into @t Values('JERRY', 2011, 12 , 50)
Declare @LatestYr Int
Declare @LatestMonth Int
Select @LatestYr= Max([Year])From @t
Select @LatestMonth = Max([Month]) From @t Where [Year] = @LatestYr
Select * From @t
Where ([Year] = @LatestYr And [Month] = @LatestMonth)
结果
上述查询仅适用于单个用户。并且对于多个用户将失败,或者在平局的情况下。例如,考虑以下场景
在这种情况下,所需的输出将是
因此,为了处理这种情况,我提出以下解决方案
解决方案 1
Select t.*
From @t t
Join
(
Select x.Name,x.Max_Year,y.Max_Month
From
( SELECT Name,Max_Year = Max([Year])
From @t
Group By Name
)x
Join
( SELECT Name,[Year],Max_Month= Max([Month])
From @t
Group By Name,[Year]
)y On x.Name = y.Name And x.Max_Year = y.[Year]
)x
On t.Name = x.Name
And t.[Year] = x.Max_Year
And t.[Month] = x.Max_Month
或者
解决方案 2 (Sql Server 2005+)
Select Name,[Year],[Month],Value
From
(
Select *,Rn = Rank() Over(Partition By Name Order By [Year] desc, [Month] Desc)
From @t
)X Where X.Rn =1
解决方案 3(Sql Server 2005+)
Select Name,[Year],[Month],Value
From
(
Select *,Rn = Dense_Rank() Over(Partition By Name Order By [Year] desc, [Month] Desc)
From @t
)X Where X.Rn =1
ddl如下
DECLARE @t Table(Name Varchar(30),[Year] Int, [Month] Int,Value Int)
Insert Into @t Values('JERRY' , 2012, 9, 100 )
Insert Into @t Values('JERRY', 2012, 9 , 120)
Insert Into @t Values('JERRY' , 2012, 9 , 130)
Insert Into @t Values('JERRY', 2012 , 8 , 20)
Insert Into @t Values('JERRY', 2011, 12 , 50)
Insert Into @t Values('FERRY' , 2010, 9, 100 )
Insert Into @t Values('FERRY', 2010, 9 , 120)
Insert Into @t Values('FERRY', 2010, 8 , 120)
Insert Into @t Values('JERRY1' , 2012, 9, 100 )
Insert Into @t Values('JERRY1', 2012, 9 , 120)
Insert Into @t Values('JERRY1' , 2012, 9 , 130)
Insert Into @t Values('JERRY1', 2012 , 8 , 20)
Insert Into @t Values('JERRY1', 2011, 12 , 50)
希望这可能会有所帮助。谢谢