定义窗口并在多个分析列中使用它

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);

【讨论】:

以上是关于定义窗口并在多个分析列中使用它的主要内容,如果未能解决你的问题,请参考以下文章

Azure 流分析时间窗口查询

在另一列中使用一列中的值

检查panda数据帧中的多个列是否重合并在新列中标记它们

PostgreSQL 分析函数窗口化以查找列中的下一个值

pandas:查找部分字符串并在新列中使用它

多个 if 循环条件并在列中打印输出