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

时间:2017-05-17 07:25:11

标签: sql oracle data-partitioning

我有一个oracle查询,我需要在同一窗口中使用多个分析函数。如何定义一个窗口,然后将其用于每个调用?

即。我想在PostGRESql中编写它:

SELECT
    sum(salary) OVER w,
    avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);

忘记提及,目标是避免代码重复,而不是加快查询速度。

2 个答案:

答案 0 :(得分:2)

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知道重复使用这两个语句的窗口。

答案 1 :(得分:0)

从20c版开始,Oracle支持window子句语法。

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