Oracle SQL Developer を使用して、HR テーブルから欠勤期間を自動的に計算しようとしています。このテーブルには、次の関連フィールドがあります。 Person_Ref - 一意の個人識別子 START_DATE - 欠勤期間の開始日。COMPDATE - 下方にカウントされる 6 桁の数字のように見えるため、最小の数字が最新です。私は最終的に、すべての人の欠勤開始日をランク付けし、最も新しい START_DATE (つまり、最も低い COMPDATE) と 3 番目に新しい START_DATE を取得し、それらの間の日数を数学的に計算するステートメントを書きたいと考えています (この表には数十年の日付が含まれています)。 PERSON_REF に対して索引付けされた各エントリ)。これは、12 か月間に 3 期間を超える欠勤がある場合に報告するビジネス要件です (つまり、
最初に PERSON_REF、最新の START_DATE、3 番目に新しい START_DATE、および COMPDATE を別のテーブルに抽出し、できれば PERSON_REF ごとに 1 行で抽出し、Visual Studio で残りのロジックを実行します。ただし、これは私の SQL の知識が私を失望させるところです。
特定の PERSON_REF に対して次のステートメントを実行すると、ランク付けされた日付を簡単に取得できます。
SELECT D57.PERSON_REF, D57.START_DATE, D57.COMPDATE, RANK() OVER (ORDER BY D57.COMPDATE asc) rnk
From D57
WHERE D57.PERSON_REF='050050713';
そこから、クエリの残りの結果から 1 番目と 3 番目の日付を選択できます。
ただし、WHERE コマンドを削除すると、明らかに、テーブル全体が順番にランク付けされます。
私が本当に知りたいのは、このサブクエリを記述して、テーブル内のすべての PERSON_REF に対して PERSON_REF ごとにランク付けされた結果を返すにはどうすればよいかということです。