我有一个oracle查询,我需要在同一窗口中使用多个分析函数。如何定义一个窗口,然后将其用于每个调用?
即。我想在PostGRESql中编写它:
SELECT
sum(salary) OVER w,
avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
忘记提及,目标是避免代码重复,而不是加快查询速度。
答案 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子句语法。
SELECT语句的query_block子句现在支持window_clause,该子句实现了SQL:2011标准中定义的SQL标准表表达式的window子句。
因此,您的查询无需更改即可完美运行:
SELECT
sum(salary) OVER w,
avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);