あなたがこのようなものが必要と思われます。私はいくつかのシミュレートされた入力を作成したWITH句に注目してください - あなたの入力ではなく、性質上似ています。計算は各patient_idに対して個別に行われることに注意してください。入力には1人の患者しかシミュレートしませんでしたが、すべてのケースで同じように動作します。ベースデータの1回のパスでは、2つのグループ(PREとPOST)の条件付き解析minとmaxを使用します。MINとMAX内のcase式は2つのグループに分離します。その後、外側のクエリでは、各患者に対して2つの行だけを選択します。出力を見て、入力と比較して、実際の表と列の名前に合わせます。
未処理左: "描画された"日時と "分注"日時が正確に等しい場合はどうなりますか?それがあなたのデータでは起こり得ない場合、明らかに、それは処理する必要はありません。
with
inputs (patient_id, dta, drawndttm, dispdttm) as (
select 1001, 'xhg', date '2017-03-23', date '2017-04-15' from dual union all
select 1001, 'abc', date '2017-03-30', date '2017-04-15' from dual union all
select 1001, 'xhg', date '2017-03-31', date '2017-04-15' from dual union all
select 1001, 'zz3', date '2017-04-22', date '2017-04-15' from dual union all
select 1001, 'ab3', date '2017-04-28', date '2017-04-15' from dual
)
-- End of SIMULATED inputs (for testing only, not part of the solution).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select patient_id, dta, drawndttm, dispdttm,
case when drawndttm < dispdttm then 'PRE' else 'POST' end as classif
from (
select patient_id, dta, drawndttm, dispdttm,
max(case when drawndttm < dispdttm then drawndttm end)
over (partition by patient_id) as max_pre,
min(case when drawndttm > dispdttm then drawndttm end)
over (partition by patient_id) as min_post
from inputs
)
where drawndttm in (max_pre, min_post)
order by patient_id, drawndttm -- if needed
;
PATIENT_ID DTA DRAWNDTTM DISPDTTM CLASSIF
---------- --- --------- --------- -------
1001 xhg 31-Mar-17 15-Apr-17 PRE
1001 zz3 22-Apr-17 15-Apr-17 POST
データは「2つの部分」に分かれていますか? (POST-テストとPRE-テスト?)POST-テストとPRE-テストのどちらかとして行を分類する別の列はありますか? 「テスト」はディスペンスイベントとマークされた1行と同じですか? – mathguy
私は、要件ごとのデータを、ディスペンスイベントdttmに基づいて変数を作成することによって、2つのPOSTテスト&プレテストに分けました(ディスパッチイベントdttm object =([Drawn Datetime] <[Disp Event Datetime]、[PRE]、[POST]の場合)、それぞれに複数の描画日付があり、それぞれから1つだけをキャプチャしようとしています。はい、ポストとプレを示す別の列があります。テストは同じでも異なっていてもかまいません。あなたの最後の質問については不明です。事前に感謝します – Ahmed