2017-12-09 12 views
0

T-SQL 질문,이 최선의/최적의 솔루션을 찾으려고했습니다. T-SQL, X 시간 내에 X 위치를 방문하는 ID를 얻는 방법은 무엇입니까?

우리가이 theoritical 표 5 분 이내에 2 개 이상의 서로 다른 위치에 있었 ID를 반환하는 쿼리를 작성하려는

----------------------------------- 
ID | DATETIME | Location 
11 | 1/27 3:30pm | a 
11 | 1/27 3:31pm | b 
11 | 1/27 3:32pm | c 
22 | 2/14 1:10pm | g 
22 | 2/14 1:12pm | i 
22 | 2/15 5:48pm | w 
55 | 3/18 8:48pm | d 
55 | 3/18 9:48pm | e 
--------------------------- 

을 말해봐. 이 경우 테이블을 보면 ID : 11과 22가 5 분 이내에 2 개 이상의 다른 위치를 방문하므로 ID 11과 22를 반환해야합니다. X만큼의 ID를 반환하는 쿼리를 어떻게 작성합니까? X 시간 내에 위치하는 시간 (분)? 당신은 위치가 주어진 ID에 대한 각 행에 다른 것을 가정하면

+0

"최고/최적의"일부 특정 구성에 당신의 부분, 작은 메모리 풋 프린트, 최소한의 I/O에 게으른을 의미합니까 ...? 특정 메트릭이 없으면 Free & Optimal 솔루션을 제공 할 수 없습니다. ("반환 ... 5 분 이내"는 성능 목표입니다.) – HABO

+1

힌트 : 다음에 'CROSS APPLY'를 사용하십시오 – Squirrel

+0

다음에 datetime 열을 샘플 데이터로 사용하면 더 완전한 형식으로 사용하십시오 * yyyy-mm- dd hh : mm : ss *는 id 22가 5 분 이내에 2 회 이상 방문하지 않는 것이 좋습니다. –

답변

1

나는 교차 적용 사용하는 것이 좋습니다

select t.*, ca.num_visit 
from table1 as t 
cross apply (
    select count(*) num_visit 
    from table1 as c 
    where c.id = t.id 
    and c.DATETIME > t.DATETIME 
    and c.DATETIME <= dateadd(minute,5,t.DATETIME) 
) ca 
where num_visit >= 2 
0

, 당신은 lead()/lag() 사용할 수 있습니다

select id, datetime 
from (select t.*, 
      lead(datetime) over (partition by id order by datetime) as next_datetime 
     from t 
    ) t 
where next_datetime < dateadd(minute, 5, datetime); 

이 문제에 대한 일반적인 해결책이 아니다. 그러나 당신의 질문에 당신이 가지고있는 특별한 예를 해결합니다.