バックグラウンド
サンプルデータセット
#Employee
Id | Period | Status
---------------------
1 | 1 | L
1 | 2 | G
2 | 3 | L
status='L' の場合にのみ、従業員の最新のレコード (期間別) を生成する単純な選択クエリが必要です。
結果は次のようになります。
#Desired Results
Id | Period | Status | Sequence
-------------------------------
2 | 3 | L | 1
素朴な試み
明らかに、クエリでの私の素朴な試みは機能しません。
#select query
SELECT *, RANK() OVER (PARTITION BY id ORDER BY period ASC) sequence
FROM employees
WHERE status = 'L'
AND sequence = 1
その結果、次のようになります。
#Naive (incorrect) Results
ID | Period | Status | Sequence
-------------------------------
1 | 1 | L | 1
2 | 3 | L | 1
SQL で句が評価される順序を知ると、それが機能しない理由が説明されます。私のクエリがどのように評価されるかは次のとおりです。
- status='L' の行を分離する
- 行をランク付けする
- 上位行を分離
私は次のものが欲しい:
- 行をランク付けする
- 上位にランク付けされた行を分離する
- status='L' を分離する
質問
SELECT/WHERE 句を単純に変更し、基本的な述語演算子のみを使用するだけで、WHERE 句の分析関数に基づく述語が非集計述語よりも先に評価されるようにすることは可能ですか?
Oracle Discoverer Plusでエンドユーザーとして実装できる他のソリューションを持っている人はいますか?
ありがとう!