0

ここにテーブル (cte) の定義と結果セットがあります

CTE は奇妙に見えるかもしれませんが、テスト済みで、これまでで最も効率的な方法で正しい結果を返します。以下のクエリは、同時に2 つ以上の薬を服用している個人 ID (patid) の数を検索します。現在、クエリは、両方の薬を同時に服用していない人の patID を返す限り機能します。両方の薬を服用していることは、1つの薬の 1 つが別の薬のfillDate前にあることで示されます。scriptEndDateそう ここに画像の説明を入力

この部分的な結果セットの 18行目で、行 2 の同じ patID のとの間にあることがscriptFillDateわかります。これらの不要な結果をフィルタリングするには、どのような制約を追加する必要がありますか?2009-07-19fillDatescriptEndDate

--PatientDrugList is a CTE because eventually parameters might be passed to it
--to alter the selection population
;with PatientDrugList(patid, filldate, scriptEndDate,drugName,strength)
as
(
    select rx.patid,rx.fillDate,rx.scriptEndDate,rx.drugName,rx.strength
        from rx
),
--the row constructor here will eventually be parameters for a stored procedure
DrugList (drugName)
as
(
    select x.drugName
        from (values ('concerta'),('fentanyl'))
        as x(drugName)
        where x.drugName is not null
)


    --the row number here is so that I can find the largest date range
    --(the largest datediff means the person was on a given drug for a larger
    --amount of time.  obviously not a optimal solution
     --celko inspired relational division!
     select distinct row_number() over(partition by pd.patid, drugname order by datediff(day,pd.fillDate,pd.scriptEndDate)desc)  as rn
     ,pd.patid
    ,pd.drugname
    ,pd.fillDate
    ,pd.scriptEndDate
    from PatientDrugList as pd
    where not exists
    (select * from DrugList 
    where not exists
    (select * from PatientDrugList as pd2
    where(pd.patid=pd2.patid)
    and (pd2.drugName = DrugList.drugName)))
    and exists 
    (select * 
        from DrugList
        where DrugList.drugName=pd.drugName
    )
    group by pd.patid, pd.drugName,pd.filldate,pd.scriptEndDate
4

1 に答える 1

1

元のクエリを CTE にラップするか、さらに良いことに、パフォーマンス、クエリ プランと結果の安定性のために、一時テーブルに保存します。

以下のクエリ (CTE オプションを想定) は、両方の薬が服用されている重複時間を示します。

;with tmp as (
   .. your query producing the columns shown ..
)
select *
  from tmp a
  join tmp b on a.patid = b.patid and a.drugname <> b.drugname
 where a.filldate < b.scriptenddate
   and b.filldate < a.scriptenddate;
于 2012-12-13T22:22:55.633 に答える