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)
結果
![enter image description here](https://i.stack.imgur.com/sYNM5.png)
上述查詢的工作只是爲單個用戶。並且會失敗多個用戶,或在關係的情況下。例如,請考慮下面的情形
![enter image description here](https://i.stack.imgur.com/joLJn.png)
在這種情況下,所需的輸出將是
![enter image description here](https://i.stack.imgur.com/s9QKq.png)
所以對於處理這樣的情況,我建議以下解決方案
解決方案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
OR
溶液2(SQL服務器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服務器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)
希望這可能有所幫助。由於
對於哪個DBMS是這樣的? –
以上是針對MSSQL的。 – Outflanker
我不明白你的輸出要求。另外 - 樣本數據應該包含另一個人的數據,而不僅僅是JERRY的? –