2016-09-07 2 views
0

SQL Server를 사용하는 경우의 질문입니다. 이 일을하는보다 우아한 방법이 있습니까? 테이블 mytable 고려SQL Server는 최신 레코드가 조건과 일치하는 레코드를 반환합니다.

나는 Foreign_ID을 추출하고자하는

ID Foreign_ID Date 
------------------------- 
1 1   01-Jul-15 
2 2   01-Sep-16 
3 3   05-Aug-16 
4 2   01-Sep-15 

(I 유닉스 타임 스탬프를 사용하고, 내가 읽기 쉽게 읽을 수있는 날짜에이 변환 한) 여기서 가장 최근 레코드의 (최고 ID) 일이 예입니다 범위에 1 년 1 월 2016 타임 스탬프에 대한 날짜를 대체하면 다음 작품 12월 31일 2016 년이다 :

select distinct 
    Foreign_ID 
from 
    mytable l1 
where 
    (select top 1 Date 
    from mytable l2 
    where l2.Foreign_ID = l1.Foreign_ID 
    order by ID desc) >= **1 Jan 2016** 
    and 
    (select top 1 Date 
    from mytable l2 
    where l2.Foreign_ID = l1.Foreign_ID 
    order by ID desc) <= **31 Dec 2016** 

Foreign_ID = 3을 반환해야 함. 이

이 더 큰 쿼리

+0

사용중인 SQLServer 버전에 태그를 지정하십시오. – TheGameiswar

답변

1

의 모든 양식 부분은 SQL 서버 2005 + 가정합니다 상기 범위에서 일자 최근 기록을 가지고 같이 간단한 쿼리도, 잘못된 것을 Foreign_ID이 반환 ROW_NUMBER를 사용할 수 있습니다

select foreign_id 
from (
    select foreign_id, row_number() over (order by id desc) as rseq 
    from myTable 
    where Date >= value1 and Date <= value2 
) as x 
where rseq = 1 

그냥 날짜 값을 입력, 당신은 migh :

WITH CTE AS 
(
    SELECT *, 
      RN = ROW_NUMBER() OVER(PARTITION BY Foreign_ID 
            ORDER BY ID DESC) 
    FROM dbo.YourTable 
    WHERE [Date] >= '01-Jan-2016' -- you need to use the right 
    AND [Date] <= '31-Dec-2016'  -- date format here 
) 
SELECT Foreign_ID 
FROM CTE 
WHERE RN = 1; 
0

을가 SQL 서버 2008+의 경우, 당신은이를 사용할 수 있습니다 "키워드"이기 때문에 "날짜"라는 칼럼 주위에 괄호 나 따옴표를 써야합니다.

관련 문제