【发布时间】:2011-07-23 05:34:39
【问题描述】:
背景
样本数据集
#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' 的行
- 对行进行排名
- 隔离顶级行
我想要以下:
- 对行进行排名
- 隔离排名靠前的行
- 隔离 where status='L'
问题
是否有可能——只需对 SELECT/WHERE 子句进行简单修改并仅使用基本谓词运算符——以确保在非聚合谓词之前评估基于 WHERE 子句中的分析函数的谓词?
是否有其他解决方案可以作为最终用户在 Oracle Discoverer Plus 中实施?
谢谢!
【问题讨论】:
-
这部分看不懂
without derived tables, sub-queries, joins, or a GROUP BY clause?所以你想烤蛋糕不加面粉牛奶鸡蛋? -
为什么不想使用派生表或子查询?
-
我有特殊的限制。我正在尝试在 GUI 查询构建器 Oracle Discoverer Plus 中以最终用户的身份实现此查询。在 Discoverer 中,我无权访问控制所有连接的 SQL 或 EUL(“最终用户层”)。所以,我正在寻找一种解决方法。
-
当面对这样的工具时,我发现最简单的方法是创建一个 VIEW,将所需的数据作为一个简单的对象提供给工具以供选择。
-
我同意 Richard 的观点 - 为此创建一个视图(在我的示例中基本上是派生表)
标签: sql oracle where-clause operator-precedence analytic-functions