2017-03-15 1 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 

가장 최근 날짜 (첫 번째 열)에 해당하는 두 번째 및 세 번째 열을 반환하는 쿼리를 작성하고 싶습니다. 특히, 결과 테이블에 다음 레코드를보고 싶지 않습니다.

201702 4435230309000156 5962 
201612 4435230309000156 7399 

비록, 내가 원하는 가장 최근 날짜 (201702)와 연결되어

201702 4435230309000156 5962 

를 검색하는 것입니다.

첫 번째 열은 "int"형식입니다.

귀하의 도움에 감사드립니다.

감사합니다, 당신은 단지 가장 최근의 행을 원하는 경우

답변

0

는, 다음과 같이 top 1를 사용할 수 있습니다

select top 1 * 
from t 
order by date desc 

당신이 col2 당신이 할 수있는 각각에 대한 가장 최근의 행을 얻으려고 노력하는 경우 그래서 같은 일반적인 테이블 식의 하위 쿼리에 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