2013-09-06 2 views
2

ID 아이디 열, 일부 데이터 및 날짜 스탬프가있는 테이블이 있다고 가정 해 봅니다. 이렇게 :순서가 잘못된 SQL은 어떻게 찾을 수 있습니까?

1 data 5/1/2013 12:30 
2 data 5/2/2013 15:32 
3 data 5/2/2013 16:45 
4 data 5/3/2013 9:32 
5 data 5/5/2013 8:21 
6 data 5/4/2013 9:36 
7 data 5/6/2013 11:42 

타임 스탬프가 5/4 인 레코드 하나를 표시하는 쿼리는 어떻게 작성합니까? 이 테이블에는 수백만 개의 레코드가 있습니다. 나는 몇 가지 조사를 해왔지만, 내가 무엇을 찾고 있는지를 무엇이라고 부를지 모른다. :/

+4

어떤 SQL Server 버전을 사용하고 있습니까? 2012 년에는'lag()'함수를 사용하는 것이 매우 쉽습니다. –

+2

어떻게 잘못 배치 된 레코드 ID 5가 아니라고 판단합니까? –

답변

7
declare @t table(id int, bla char(4), timestamp datetime) 
insert @t values 
(1,'data','5/1/2013 12:30'), 
(2,'data','5/2/2013 15:32'), 
(3,'data','5/2/2013 16:45'), 
(4,'data','5/3/2013 9:32'), 
(5,'data','5/5/2013 8:21'), 
(6,'data','5/4/2013 9:36'), 
(7,'data','5/6/2013 11:42') 

select timestamp 
from 
(
    select rn1 = row_number() over (order by id), 
    rn2 = row_number() over (order by timestamp), timestamp 
    from @t 
) a 
where rn1 not in (rn2, rn2-1) 
+0

은'rn1> rn2'이면 충분합니까? –

+1

@RomanPekar 충분할 수 있습니다. 질문의 해석 방식과 비슷합니다. 이 방법으로 허용되는 행을 매우 까다롭게 처리합니다. –

+0

지금 실행 중이지만 1 천만 개가 넘는 레코드가 있습니다. We 'll see ...;) –

0

2008 R2에서,이 방법

DECLARE @Table AS TABLE 
(id INT , ladate DATETIME) 

INSERT INTO @Table VALUES (1, '2013-05-01') 
INSERT INTO @Table VALUES (2, '2013-05-02') 
INSERT INTO @Table VALUES (3, '2013-05-03') 
INSERT INTO @Table VALUES (4, '2013-05-05') 
INSERT INTO @Table VALUES (5, '2013-05-04') 
INSERT INTO @Table VALUES (6, '2013-05-06') 
INSERT INTO @Table VALUES (7, '2013-05-07') 
INSERT INTO @Table VALUES (8, '2013-05-08') 

이라면 .. 닥터 버크 정렬 순서에 레코드를 추가하지만 경우에하는 것은 단지 당신이 쿼리

SELECT t2.ladate FROM @Table T1 
INNER JOIN @Table T2 ON T1.Id = T2.Id + 1 
INNER JOIN @Table t3 ON t2.id = t3.id + 1 
WHERE t3.ladate < t2.ladate AND t2.ladate > t1.ladate 
으로 정렬되어 있는지 확인을 할 것입니다

- 난 rownumbers이없는 경우, 1,2,3,4,5 .... 아무도 ..., 당신은) (ROW_NUMBER를 사용할 수 없습니다 누락 아이디 모두가 가정을 만들어

+0

사실, ID 열이 자동이고 1 천만 개가 넘는 레코드가있는 경우 누락 된 ID는 하나뿐입니다. 9 년 전이었습니다. –

+0

의 t-clausen 응답이 더 좋았습니다.) 슬프게도 내 것을 투표 할 수는 없다.) – SerenityNow

+0

다른 대답이 처음 이었기 때문에 나는 시도하지 않았다. (시간이 아닌, 페이지에 나열되어있다.) 그러나 다른 대답이 더 좋기 때문에 이것은 투표 해. ;) –

관련 문제