web-dev-qa-db-ja.com

テーブルデータから最小および最大の日付を取得する方法

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

これを達成するためのアイデアはありますか?

3
Brad

これが簡単な方法です。 CTEを使用して、各ジョブの最初と最後のINSERT_DATEsを取得します。次に、メインテーブルに結合して、最初と最後の読み込みから完了予定日を取得します。

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 - 1j.load_countに変更します。

1
RDFozz

FIRSTLASTKEEPとともに使用できます。

ソートされたグループの最初または最後の行の値が必要だが、必要な値がソートキーではない場合、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;

結果セット: enter image description here

MIN集約関数は、ここでは何の役にも立たないことに注意してください。これは、各JOBINSERT_DATEごとに常に最大1行が取得されるためです。クエリがコンパイルされるようにするためです。

DBフィドルリンク

1
Joe Obbish

各ジョブの変更の最小値、最大値、および数を取得するには、このようなことをします。ただし、推定日が以前の日付に変更された場合、これは正確ではありません。

SELECT job,
       MIN(est_completion),
       MAX(est_completion),
       COUNT(job)
FROM   ktimov.press_schd
GROUP BY job
0
Joe W