2011-10-05 2 views
0

나는 고유 한 사람 ID, 장소 ID 및 60 분 이내에 방문의 첫 출현 만있는 값을 반환하는 쿼리를 작성하려고합니다.시간으로 구분 된 SQL Select 레코드

다음

내가 필요에 가까운 ..

SELECT * FROM 
(
SELECT 
    RANK() OVER (PARTITION BY A.PersonId, A.PlaceId, 
    DATEDIFF(hh, A.Visit_Datetime, GETDATE()) ORDER BY A.Visit_Datetime) AS RNK, 
    A.RecordId, 
    A.PersonId, 
    A.PlaceId 
FROM 
    Table A 
) A 
WHERE 
    A.Rnk = 1 

문제와입니다 오전 10시 50분에서 사람의 방문이 후 두 번째 레코드 11:10시에 생성되고, 두 기록이 위의 경우 그 사람, 장소 및 60 분 범위로이 기록을 순위 매기기 만하면됩니다.

나는 이것이 의미가 있기를 바랍니다. 도와 주셔서 감사합니다.

답변

0

현재 시간에 의해 결정이

SELECT * FROM 
( 
SELECT 
    RANK() OVER (PARTITION BY A.PersonId, A.PlaceId, 
    DATEDIFF(hh, 0, A.Visit_Datetime) ORDER BY A.Visit_Datetime) AS RNK, 
    A.RecordId, 
    A.PersonId, 
    A.PlaceId 
FROM 
    Table A 
) A 
WHERE 
    A.Rnk = 1 
0

현재는 고정 그룹화하는 시간의 기간을보십시오. 움직이는 시간을 원합니다. 현재 날짜 또는 0과 같은 리터럴을 기반으로 할 수 없습니다. 이것은 가능한 모든 시간대의 시간대를 그룹화해야 함을 의미합니다. 다행히도 다 계산할 필요는 없습니다. 대신 각 방문 시간의 시간대를 그룹화하십시오. 즉 10:50의 여러 순위를 가진 유사한 중복 그룹을 생성합니다 11시 10분 및

FROM Table as A 
JOIN Table as B ON A.Visit_Datetime BETWEEN DATEADD(HOUR,-1,B.Visit_Datetime) 
    AND B.Visit_Datetime 

이 12시 10분 간의 방문과 10시 50분 및 11시 50분와 11시 10분 사이의 모든 방문과 그룹화 1. B가 모든 어? 런스에 조인되었지만 첫 x 째 어커런스가 필요합니다. 어커런스를 함께 그룹화하고 min을 사용하여 첫 번째 어커런스를 가져옵니다. 이 같은 뭔가 :

SELECT DISTINCT MIN(A.Visit_Datetime) as InitVisit, B.RecordId, B.PersonId, B.PlaceID, 
FROM Table as A 
JOIN Table as B ON A.Visit_Datetime BETWEEN DATEADD(HOUR,-1,B.Visit_Datetime) AND B.Visit_Datetime 
AND B.RecordId = A.RecordId AND B.PersonId = A.PersonId AND B.PlaceID = A.PlaceId 
GROUP BY B.RecordId, B.PersonId, B.PlaceID, B.Visit_Datetime 

이 각 기록, 사람, 장소 시간을 방문하여 주어야한다. 방문 기간은 실제로 길이에 관계없이 각 발생은 다른 기간의 60 분 이내에 있습니다. 이것은 당신이하려고하는 곳과 같은 소리입니다.