2016-11-30 8 views
0

Netezza를 사용하고 있습니다.SQL에서 연속 된 시간 그룹에 공통 값을 부여합니다.

두 개의 필드가있는 테이블이 있다고 가정 해 보겠습니다. 한 필드는 하루 중 매시간에 해당하는 타임 스탬프이고, 다른 하나는 환자가 한 시간 동안 제산제를 복용했는지 여부를 나타내는 지표입니다. 표는 다음과 같습니다 :

Timestamp   Antacid? 
11/23/2016 08:00   1 
11/23/2016 09:00   1 
11/23/2016 10:00   1 
11/23/2016 11:00   0 
11/23/2016 12:00   0 
11/23/2016 13:00   1 
11/23/2016 14:00   1 
11/23/2016 15:00   0 

각 연속 시간 간격에 공통 파티션 값을 할당하는 방법이 있습니까? 이런 식으로 뭔가 ...

Timestamp   Antacid?  Group 
11/23/2016 08:00   1   1 
11/23/2016 09:00   1   1 
11/23/2016 10:00   1   1 
11/23/2016 11:00   0  NULL 
11/23/2016 12:00   0  NULL 
11/23/2016 13:00   1   2 
11/23/2016 14:00   1   2 
11/23/2016 15:00   0  NULL 

내가 궁극적 것 제산제의 사용과 연속 시간 (첫 번째 그룹에 대해 이렇게 시작 및 종료 날짜 시작 날짜와 종료 날짜를 파악하고자 23분의 11/2016 08:00 및 11/23/2016 10:00이고 두 번째 그룹의 시작/종료 날짜는 각각 11/23/2016 13:00 및 11/23/2016 14:00입니다. 이전에 extract (date - row_number()에서 에포크)를 사용하여 연속 일을 수행했지만 시간을 처리하는 방법을 잘 모르겠습니다.

답변

1

각 환자 (이 질문의 ID)에 대해이 작업을 수행해야한다고 가정합니다.

select id,antacid,min(dt) startdate,max(dt) enddate from (
select t.*, 
-row_number() over(partition by id,antacid order by dt) 
+ row_number() over(partition by id order by dt) grp 
from t 
) x 
where antacid = 1 
group by id,antacid,grp 
order by 1,3 

내부 쿼리는 주어진 환자 ID에 대한 제산을 위해 0과 1의 연속적인 그룹을 가져옵니다. antacid = 1에 대한 시작 및 종료 날짜 만 필요하기 때문에 where 절을 사용하여 필터링 할 수 있습니다.

매일 파티션을 완료해야하는 경우 파티션을 날짜별로 추가하십시오.

편집 : 현재 행과 다음 행의 차이가 1 시간 인 경우에만 행을 그룹화합니다.

select id,antacid,min(dt) startdate,max(dt) enddate from (
select t.*, 
--change dateadd as per Netezza functions so you add -row_number hours 
dateadd(hour,-row_number() over(partition by id,antacid order by dt),dt) grp 
from t 
) x 
where antacid = 1 
group by id,antacid,grp 
order by 1,3 
+0

나는 이것을 시도했지만 일부 연속하지 않은 시간을 함께 그룹화했습니다. 내 결과를 보여 주지만 기밀 데이터가 포함되어 있습니다. – user3642531

+0

나는 당신이 말하는 것을 얻었습니다. 그래서 시간 차이가 1. 인 경우에 그들을 분류해야합니다. 맞습니까? –

+0

예. 제산제를 투여 한 후 몇 시간. 다른 모든 것은 null 일 수 있습니다. – user3642531