2009-11-20 2 views
0

다음 SQL Server 쿼리가 있는데 주어진 ID에서 다음 행과 이전 행을 가져 오려고합니다. 같은 날짜가 두 개 이상 있지 않으면 모든 작품이 훌륭합니다. 그런 다음 내 논리는 무너집니다. 당신이 다음 @currentId = 4를 설정하면SQL 서버는 날짜를 기준으로 테이블에서 다음 행을 가져옵니다.

은 당신이 설정 한 경우 ID 7은 이전

에 대해 (이 아이디 6이어야 함) 돌아 @currentId = 6는 내가 다시 ID 2 (이 ID 4해야 얻을)에 대한

declare @t table (i int, d datetime) 
insert into @t (i, d) 
select 1, '17-Nov-2009 07:22:13' union 
select 2, '18-Nov-2009 07:22:14' union 
select 3, '17-Nov-2009 07:23:15' union 
select 4, '20-Nov-2009 07:22:18' union 
select 5, '17-Nov-2009 07:22:17' union 
select 6, '20-Nov-2009 07:22:18' union 
select 7, '21-Nov-2009 07:22:19' 

--order that I want 
select * from @t order by d desc, i 

declare @currentId int; set @currentId = 4 

--Get Prev 
select TOP 1 * from @t where d > (select TOP 1 d from @t where i = @currentId order by d, i desc) order by d, i desc 

--Get Next 
select TOP 1 * from @t where d < (select TOP 1 d from @t where i = @currentId order by d desc) order by d desc 

사람이 내가이 순서, 날짜 제품 설명, 아이디 ASC

를 유지하는 것이 중요합니다, 나에게 주어진 ID를 기반으로 다음/이전 행을 얻을 보장하는 방법을 작업 할 수 있도록 할 수 옆에

많은 감사

편집이 : 그것은이 2005

답변

1

거의 다 왔었는데 ... 대신 사용해보십시오. 효과적으로 할 날짜 비교를 변경 "을 ...- 나 - 투 - 동일"하고 같은 행을 반환하지 않도록 그것을 말하는 것은 ... 답변

declare @currID int 
set @currID = 4 

select top 1 * 
from (
    select * 
     from @t 
     where d = (select d from @t where i = @currID) 
      and i > @currID 
    union ALL 
    select * 
     from @t 
     where d < (select d from @t where i = @currID) 
) as t 
order by d desc, i 

select top 1 * 
from (
    select * 
     from @t 
     where d = (select d from @t where i = @currID) 
      and i < @currID 
    union ALL 
    select * 
     from @t 
     where d > (select d from @t where i = @currID) 
) as t 
order by d, i desc 
+0

Chris 님,이 점에 대해 감사드립니다. 스키마가 다르기 때문에이 작업을 수행하기 위해 애 쓰고 있습니다. 나는 네가 제안하고있는 것을 볼 수있다. – Rippo

+0

다른 ... ...? 위에서 제공 한 예제 테이블과 데이터와 함께 작동해야합니다 :-) 이것을 라이브 스키마에 적용해야한다고 가정합니다. –

+0

내 실수 - 내 SQL에 오타가 있었다. (다른 곳에서 테스트 한 후에 정리할 수있는 stackoverflow에서 SQL을 편집하는 역할을한다.) 그것은 지금 작동 할 것이다 ...! –

0

장난감 당신은 자르해야이

declare @t table (i int, d datetime) 
     insert into @t (i, d) 
     select 1, '17-Nov-2009 07:22:13' union 
     select 2, '18-Nov-2009 07:22:14' union 
     select 3, '17-Nov-2009 07:23:15' union 
     select 4, '20-Nov-2009 07:22:18' union 
     select 5, '17-Nov-2009 07:22:17' union 
     select 6, '20-Nov-2009 07:22:18' union 
     select 7, '21-Nov-2009 07:22:19' 

     --order that I want 
     select * from @t order by d desc, i 

     declare @currentId int; 
     set @currentId = 4 



SELECT TOP 1 t.* 
FROM @t t INNER JOIN 
      (
       SELECT d CurrentDateVal 
       FROM @t 
       WHERE i = @currentId 
      ) currentDate ON t.d <= currentDate.CurrentDateVal AND t.i != @currentId 
    ORDER BY t.d DESC 

    SELECT t.* 
FROM @t t INNER JOIN 
      (
       SELECT d CurrentDateVal 
       FROM @t 
       WHERE i = @currentId 
      ) currentDate ON t.d >= currentDate.CurrentDateVal AND t.i != @currentId 
    ORDER BY t.d 

뭔가를 시도 할 수 있습니다 SQL 서버에 사용되는 것입니다 주목해야한다, 그것은 6한다는 것을 보일 수있다 전과 다음이되어야한다.

+0

덕분에 현재 ID와 일치하지 하지만 당신의 대답을 실행하고 4의 현재 이드에서 6과 4를 되 찾으십시오. 나는 currentId가 4 일 경우 7 (이전)과 6 (다음)을 기대해야합니다. – Rippo

+0

몇 가지 사항을 변경했습니다. 이봐 요. –

+0

이걸로 못 박는 것처럼 보입니다. 나는 <= and > = 시도했지만 현재 ID를 제외 생각하지 않았다 ... thanks – Rippo

관련 문제