SQLローダーを使用してcsvファイルからデータを挿入する夜間ジョブがあります。データの小さなサンプルは次のとおりです。
select * from ktimov.press_schd order by job;
PLANT JOB EST_COMPLETION INSERT_DATE
10 111 6/26/2017 5/10/2017
10 111 7/1/2017 5/11/2017
10 111 7/5/2017 5/12/2017
10 222 6/20/2017 5/10/2017
10 222 6/26/2017 5/11/2017
10 333 7/26/2017 5/10/2017
10 333 6/30/2017 5/11/2017
10 333 8/10/2017 5/12/2017
10 333 8/6/2017 5/13/2017
10 333 8/7/2017 5/14/2017
INSERT_DATE
は、レコードが挿入されたときのデフォルトのsysdateです。EST_COMPLETION
は、JOBが完了する時期の見積もりです。だから例えば:
2017年5月10日、JOB#111は6/26までに完了すると推定されていました。その後、5/11に推定完了が7/1に変更されました。
このデータをクエリして、次の情報を表示しようとしています。
JOB#、最初のEST日付、最後のEST日付、変更された回数のカウント。
最終結果は次のようになります。
JOB FIRST_DATE LAST DATE Count_Changes
111 6/26/2017 7/5/2017 3
222 6/20/2017 6/26/2017 2
333 7/26/2017 8/7/2017 5
これを達成するためのアイデアはありますか?
これが簡単な方法です。 CTEを使用して、各ジョブの最初と最後のINSERT_DATE
sを取得します。次に、メインテーブルに結合して、最初と最後の読み込みから完了予定日を取得します。
WITH JobFirstLast (job, first_load, last_load, load_count) AS
(SELECT job,
MIN(INSERT_DATE) as first_load,
MAX(INSERT_DATE) as last_load,
COUNT(job) as load_count
FROM ktimov.press_schd
GROUP BY job
)
SELECT j.job
,f.EST_COMPLETION as first_est_completion
,l.EST_COMPLETION as last_est_completion
,j.load_count - 1 as times_changed
FROM JobFirstLast j
LEFT JOIN ktimov.press_schd f ON (j.job = f.job AND j.first_load = f.INSERT_DATE)
LEFT JOIN ktimov.press_schd l ON (j.job = l.job AND j.last_load = l.INSERT_DATE);
注:最初のロードは単に初期値を確立することであり、後続のロードのみが変更としてカウントされると想定しています。ロードの合計数が本当に必要な場合は、j.load_count - 1
をj.load_count
に変更します。
FIRST
とLAST
をKEEP
とともに使用できます。
ソートされたグループの最初または最後の行の値が必要だが、必要な値がソートキーではない場合、FIRST関数とLAST関数は、自己結合またはビューの必要をなくし、パフォーマンスを向上させます。
1つの実装は次のとおりです。
SELECT JOB
, MIN(EST_COMPLETION) KEEP (DENSE_RANK FIRST ORDER BY INSERT_DATE)
, MIN(EST_COMPLETION) KEEP (DENSE_RANK LAST ORDER BY INSERT_DATE)
, COUNT(*)
FROM press_schd
GROUP BY JOB;
MIN
集約関数は、ここでは何の役にも立たないことに注意してください。これは、各JOB
のINSERT_DATE
ごとに常に最大1行が取得されるためです。クエリがコンパイルされるようにするためです。
各ジョブの変更の最小値、最大値、および数を取得するには、このようなことをします。ただし、推定日が以前の日付に変更された場合、これは正確ではありません。
SELECT job,
MIN(est_completion),
MAX(est_completion),
COUNT(job)
FROM ktimov.press_schd
GROUP BY job