2015-01-13 2 views
1

단일 테이블에서 다음/이전 레코드의 ID를 가져와야합니다. 중요한 테이블 필드는 Id 및 Date입니다. 데이터 예 :데이터가 날짜순으로 정렬 된 다음 레코드 얻기

Date   Id 
2015/01/15 3 
2015/01/15 5 
2015/01/15 7 
2015/01/16 4 
2015/01/16 6 
2015/01/16 8 

자세히 알 수 있듯이 레코드는 Date, then Id로 정렬됩니다. 현재 레코드가 Id = 5 인 레코드이면 다음 레코드에는 7을 반환하고 이전 레코드에는 3을 반환해야합니다. 이는 쿼리가 Id 매개 변수를 받고 적절한 결과를 반환한다는 것을 의미합니다.

아무도 아이디어가 있습니까? 나는 특정 데이터베이스 시스템에 특정한 것이 아니라 일반적인 SQL 접근법을 선호한다.

답변

2
DECLARE @table table 
(
    Date Date, 
    Id int 
) 

INSERT @table VALUES 
('2015/01/15', 3), 
('2015/01/15', 5), 
('2015/01/15', 7), 
('2015/01/16', 4), 
('2015/01/16', 6), 
('2015/01/16', 8) 


SELECT 
    *, 
    (SELECT TOP 1 Id FROM @table WHERE [Date] < [current].[Date] OR ([Date] = [current].[Date] AND Id < [current].Id) ORDER BY [Date] DESC, Id DESC) AS PreviousId, 
    (SELECT TOP 1 Id FROM @table WHERE [Date] > [current].[Date] OR ([Date] = [current].[Date] AND Id > [current].Id) ORDER BY [Date], Id) AS NextId 
FROM 
    @table [current] 

작동합니다 하위 쿼리를 사용하여,하지만 당신은 당신과 같이 LAGLEAD 기능을 이용할 수 있습니다 SQL 서버 2012을 사용하는 경우 ID가 같은 날짜

+0

을 ID 필드는 ID 열이므로 고유합니다. 그래도 예제가 작동하지 않습니다. 첫 번째 SELECT TOP 1 쿼리 만 실행하면 (각 레코드에 대해 다음 및 이전 레코드를 모두 가져올 필요가 없으므로 하나의 레코드에 대해서만 하나씩 만 가져올 수 있음) 예기치 않은 결과가 발생하고 [날짜]에 문제가 있습니다. Goran

+0

예, [Date]의 주문도 포함되어야합니다. 편집 – Eric

+0

을 참조하십시오. 감사합니다. 지금은 괜찮아 보입니다. – Goran

0

에 대해 고유해야합니다

DECLARE @table table 
(
    Date Date, 
    Id int 
) 

INSERT @table VALUES 
('2015/01/15', 3), 
('2015/01/15', 5), 
('2015/01/15', 7), 
('2015/01/16', 4), 
('2015/01/16', 6), 
('2015/01/16', 8) 

;with cte as 
(
select 
[Date], 
Id, 
LAG(Id, 1, 0) over(order by [date]) previousId, 
LEAD(Id, 1, 0) over(order by [date]) nextId 
from @table 
) 
select * from cte where id = 5 
+0

'LAG'과'LEAD' 버전이 소개 되었습니까? – Kromster

+0

In Sql Server 2012 – BENLTAIEF

+0

답변에 cos을 추가 할 수 있습니다. cos은 이전 버전을 계속 사용할 수 있습니다. – Kromster

관련 문제