2016-12-08 2 views
0

3 명 이상의 연속 약속을 놓친 모든 사람을 찾고 있습니다. 이 작업을 수행하는 데 windowing 함수를 사용할 수 있다고 믿지만, 막혀서 도움이 필요합니다. 여기 TSQL - 창 기능/순위

내가 무엇을 찾고 샘플입니다 : 다음 PATID = X001의 경우 1/12,1/14,1/15 누락 된 기준을 충족 그리고 PATID = X002 기준을 충족하지 않음.

PATID DEPT DATE  STATUS 
x001 A002 1/1/2016 Missed 
x001 A002 1/5/2016 Complete 
x001 A002 1/8/2016 Missed 
x001 A002 1/10/2016 Complete 
x001 A002 1/12/2016 Missed 
x001 A002 1/14/2016 Missed 
x001 A002 1/15/2016 Missed 
x001 A002 1/19/2016 Complete 

x002 A003 1/1/2016 Missed 
x002 A003 1/5/2016 Complete 
x002 A003 1/8/2016 Missed 
x002 A003 1/10/2016 Complete 
x002 A003 1/12/2016 Missed 
x002 A003 1/14/2016 Complete 
x002 A003 1/15/2016 Missed 
x002 A003 1/19/2016 Complete 

이것은 내가 지금까지 가지고있는 것입니다. 내가 날짜로 새로운 상태의 변화에 ​​올바른 휴식을 할당하는 방법을 파악하면

SELECT 
PR.PATID 
, PR.DEPT 
, PR.DATE 
, CASE WHEN PR.STATUS IN (3,4) THEN 'Cancel' WHEN PR.STATUS = 2 THEN 'COMPLETED' ELSE 'ERROR' END AS STATUS, ROW_NUMBER() OVER (PARTITION BY PR.PAT_ID,PR.DEPARTMENT_ID ORDER BY R.PAT_ID,PR.DEPARTMENT_ID,PR.CONTACT_DATE) AS RN -- Just numbers the rows 
, COUNT(*) OVER (PARTITION BY PR.PAT_ID,PR.DEPARTMENT_ID, CASE WHEN PR.APPT_STATUS_C IN (3,4) AND PR.CANCEL_REASON_C <> 4 THEN 'Cancel'     WHEN PR.APPT_STATUS_C = 2 THEN 'COMPLETED' ELSE 'ERROR' END) AS RNC -- Should have break at new statuses 
FROM #PatsReturn AS PR 

, 그때 3을 놓친 한 PATIDs를 (아마도 새로운 플래그 필드를 ??)를 식별 할 수있는 방법을 강구해야 + 연속 ....

도움을 주시면 대단히 감사하겠습니다.

답변

2

한 가지 방법은 단지 lag()/lead()을 사용하는 것입니다

감사 : 각 순서에 대한 정보를 원하는 경우

select distinct patid 
from (select pr.*, 
      lead(status) over (partition by patid order by date) as status_1, 
      lead(status, 2) over (partition by patid order by date) as status_2 
     from #PatsReturn pr 
    ) pr 
where status = 'Missed' and status_1 = 'Missed' and status_2 = 'Missed'; 

, 당신은 유사한 약속의 그룹을 식별 할 수 있습니다. 한 가지 방법은 행 번호의 차이 :

select patid, count(*) as numMissed, min(date), max(date) 
from (select pr.*, 
      row_number() over (partition by patid order by date) as seqnum_p, 
      row_number() over (partition by patid, status order by date) as seqnum_ps 
     from #PatsReturn pr 
    ) pr 
where status = 'Missed' 
group by patid, (seqnum_p - seqnum_ps) 
having count(*) >= 3; 

이 어떻게 작동하는지 이해 하위 쿼리를 실행하고 두 "을 임의로"값의 차이가 동일한 상태의 시퀀스 일정 패턴을 볼 수 있습니다하십시오.

0

고든의 첫 번째 해결 방법을 찾으려면 POC 색인이 필요합니다. 말이 테이블입니다 :

CREATE TABLE #PatsReturn (PATID char(4), DEPT char(4), [date] date, [status] varchar(10)); 

당신은이 인덱스를 원하는 것 :

CREATE UNIQUE INDEX nc_PatsReturn ON #PatsReturn(PATID, [date]) INCLUDE ([status]); 

이것은 좋은, 선형 정렬 무료 쿼리 실행 계획을 보장합니다. 두 번째 해결책은 색인을 작성하는 데 다소 까다로울 수 있습니다.