0
SELECT "Name""Month","Year","Value" 
from Table
WHERE 
    "Name" LIKE '%JERRY%'
AND "Year" = 
    (SELECT MAX("Year") FROM Table where "Name" LIKE '%JERRY%')
AND "Month"= 
    (SELECT MAX("Month") FROM Table 
     where 
        "Name" LIKE '%JERRY%' 
    AND "Year"= (SELECT MAX("Year") FROM Table where "Name" LIKE '%JERRY%'))

表->

Name  | Year | Month | Value
-----------------------------
JERRY   2012    9        100           
JERRY   2012    9        120         
JERRY   2012    9        130           
JERRY   2012    8         20        
JERRY   2011    12        50           

したがって、最初の3行を出力として使用します。直近の年の直近の月はすべての値が必要です。誰かがよりクリーンなクエリを提案できますか?

4

4 に答える 4

2

テーブルに他の人がいる場合は、ランキング関数を使用することをお勧めします。次のようなものです。


DECLARE @sample TABLE (
      [Name] VARCHAR(255)
    , [Year] INT
    , [Month] INT
    , [Value] INT
    )

INSERT @sample ([Name], [Year], [Month], [Value])
VALUES ('JERRY', 2012, 9, 100)           
     , ('JERRY', 2012, 9, 120)
     , ('JERRY', 2012, 9, 130)
     , ('JERRY', 2012, 8, 20)
     , ('JERRY', 2011, 12, 50)
     , ('FRED', 2011, 12, 50)
     , ('FRED', 2011, 12, 120)
     , ('FRED', 2011, 7, 150)

SELECT *
FROM (
    SELECT *
         , RANK() OVER (PARTITION BY [Name] ORDER BY [Year] DESC, [Month] DESC) AS [rnk]
    FROM @sample
    )
    AS samp
WHERE
    samp.[rnk] = 1

結果が得られます:

名前年月値rnk
------------------------- ----------- ----------- --- -------- ------
FRED 2011 12 50 1
FRED 2011 12120 1
ジェリー201291001
ジェリー20129120 1
ジェリー20129130 1
于 2012-10-25T11:39:16.293 に答える
1
select * from @t where
[Year] = (select max([year]) from @t) and 
[Month] = (select max([Month]) from @t where [Year]=(select max([year]) from @t))
于 2012-10-25T11:22:54.970 に答える
1
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人のユーザーに対してのみ機能します。また、複数のユーザーの場合、または同点の場合は失敗します。たとえば、次のシナリオを考えてみましょう

ここに画像の説明を入力してください

この場合、必要な出力は次のようになります。

ここに画像の説明を入力してください

そこで、このような状況に対処するために、以下の解決策を提案します。

解決策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)

これがお役に立てば幸いです。ありがとう

于 2012-10-25T11:23:09.257 に答える
0
select * 
from    your_table
where   "Name" LIKE '%JERRY%' 
and     year*100+month 

in(
    select top 1 year*100+month 
    from your_table
    where 
    "Name" LIKE '%JERRY%' 
    order by cast(year*100+month as int) desc)


デモをクリックしてください

于 2012-10-26T02:38:44.553 に答える