2017-03-15 3 views
-1

私は以下のようなテーブルを持っています。カラムで並べ替え

201610 4435230309000131 5969 
201601 4435230309000149 5969 
201702 4435230309000149 5977 
201702 4435230309000156 5962 
201612 4435230309000156 7399 
201702 4435230309000164 4812 
201702 4435230309000172 7230 
201702 4435230309000180 5968 
201701 4435230309000180 5977 

最新の日付(最初の列)に対応する2番目と3番目の列を返すクエリを作成したいと思います。具体的には、結果テーブルに次のレコードを表示したくありません。

201702 4435230309000156 5962 
201612 4435230309000156 7399 

けれども、私が欲しいのは最新の日付(201702)に関連付けられている

201702 4435230309000156 5962 

を取得することです。

最初の列は「int」形式です。

あなたのお手伝いがありがとうございます。あなたはcol2ごとに最新の行を取得することができますしようとしている場合

select top 1 * 
from t 
order by date desc 

:あなただけの最新の行をしたい場合は

おかげで、

答えて

0

は、その後、あなたはそうのようなtop 1を使用することができますそのような共通テーブル式のサブクエリでrow_number()を使用します。

select 
    [date] 
    , col2 
    , col3 
from (
    select * 
    , rn = row_number() over (
     partition by col2 
     order by [date] desc 
     ) 
    from t 
) as s 
where rn = 1 
0

あなたはロジックを次のようにデータを取得しますか?

DECLARE @tb TABLE(col1 INT,col2 VARCHAR(20),col3 INT) 
INSERT INTO @tb 
SELECT 201610,'4435230309000131',5969 UNION ALL 
SELECT 201601,'4435230309000149',5969 UNION ALL 
SELECT 201702,'4435230309000149',5977 UNION ALL 
SELECT 201702,'4435230309000156',5962 UNION ALL 
SELECT 201612,'4435230309000156',7399 UNION ALL 
SELECT 201702,'4435230309000164',4812 UNION ALL 
SELECT 201702,'4435230309000172',7230 UNION ALL 
SELECT 201702,'4435230309000180',5968 UNION ALL 
SELECT 201701,'4435230309000180',5977 
SELECT * FROM (
SELECT MAX(col1)OVER() AS RecentDay, *,ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col2) AS rn1, ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col3) AS rn2 FROM @tb 
) AS t WHERE t.RecentDay=t.col1 AND t.rn1=t.rn2 
 
RecentDay col1  col2     col3  rn1     rn2 
----------- ----------- -------------------- ----------- -------------------- -------------------- 
201702  201702  4435230309000156  5962  2     2 
関連する問題