背景
样本数据集
#Employee
Id | Period | Status
---------------------
1 | 1 | L
1 | 2 | G
2 | 3 | L
我想要一个简单的选择查询来产生员工的最新记录(按期间),只有当状态='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' 的行
- 对行进行排名
- 隔离顶级行
我想要以下内容:
- 对行进行排名
- 隔离排名靠前的行
- 隔离状态='L'
问题
是否有可能——仅对 SELECT/WHERE 子句进行简单修改并仅使用基本谓词运算符——以确保基于 WHERE 子句中的分析函数的谓词在非聚合谓词之前得到评估?
任何人都有其他可以作为最终用户在 Oracle Discoverer Plus 中实施的解决方案吗?
谢谢!