ここにテーブル (cte) の定義と結果セットがあります
CTE は奇妙に見えるかもしれませんが、テスト済みで、これまでで最も効率的な方法で正しい結果を返します。以下のクエリは、同時に2 つ以上の薬を服用している個人 ID (patid) の数を検索します。現在、クエリは、両方の薬を同時に服用していない人の patID を返す限り機能します。両方の薬を服用していることは、1つの薬の 1 つが別の薬のfillDate
前にあることで示されます。scriptEndDate
そう
この部分的な結果セットの 18行目で、行 2 の同じ patID のとの間にあることがscriptFillDate
わかります。これらの不要な結果をフィルタリングするには、どのような制約を追加する必要がありますか?2009-07-19
fillDate
scriptEndDate
--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