2016-12-08 6 views
0

私は3つ以上の連続した予定を逃したすべての人を検索しようとしています。私は、これを達成するためにウィンドウ関数を使うことができると信じていますが、私は立ち往生していて、何か助けを求めています。ここで 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 +連続....

何か助けていただければ幸いです。

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'; 

あなたは各シーケンスに関する情報が必要な場合は、あなたが同様の予定のグループを識別することができます

おかげで、

答えて

2

は一つの方法は、単にlag()/lead()を使用することです。一つの方法は、行番号の違いです:

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; 

が、これがどのように機能するかを理解するサブクエリを実行し、次の2つの「SEQNUM」値の差は同じ状態のシーケンスのために一定のパターンを見ることができますするには。

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]); 

これはいい、線形ソートのないクエリ実行プランを保証します。 2番目の解決方法は、インデックスを作成するのがややこしいでしょう。

関連する問題