定义窗口并在多个分析列中使用它
Posted
技术标签:
【中文标题】定义窗口并在多个分析列中使用它【英文标题】:Define window and use it in several analytic columns 【发布时间】:2017-05-17 07:25:10 【问题描述】:我有一个 oracle 查询,我需要在同一个窗口中使用多个分析函数。如何定义一次窗口,然后将其用于每个调用?
即我想像 PostGRESql 一样写:
SELECT
sum(salary) OVER w,
avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
忘了说,目的是避免代码重复,而不是加快查询速度。
【问题讨论】:
【参考方案1】:Oracle 不支持该语法。只需在每个分析语句中指定窗口即可:
SELECT
sum(salary) OVER (PARTITION BY depname ORDER BY salary DESC),
avg(salary) OVER (PARTITION BY depname ORDER BY salary DESC)
FROM empsalary;
如果您查看查询的解释计划,那么应该只有一个 WINDOW (SORT)
操作,因为 Oracle 知道为两个语句重复使用该窗口。
【讨论】:
伤心。目标是避免代码重复,而不是加快查询速度。 欢迎向 Oracle 提出修改建议:community.oracle.com/community/database/database-ideas【参考方案2】:从版本 20c 开始,Oracle 支持窗口子句语法。
Enhanced Analytic Functions
SELECT 语句的 query_block 子句现在支持 window_clause,它实现了 SQL:2011 标准中定义的 SQL 标准表表达式的 window 子句。
SELECT
因此,您的查询无需更改即可完美运行:
SELECT
sum(salary) OVER w,
avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
【讨论】:
以上是关于定义窗口并在多个分析列中使用它的主要内容,如果未能解决你的问题,请参考以下文章