窗口函数不会像非窗口聚合调用那样使行分组到单个输出行中。相反,这些行保留了它们单独的身份。不可以和GROUP BY、 WHERE子句一起用。如果在执行窗口计算后需要过滤或分组行,则可以使用子选择。
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
您还可以使用OVER中的顺序BY来控制窗口函数处理行的顺序。(窗口顺序BY甚至不必与行的顺序匹配。)下面是一个例子:
SELECT depname, empno, salary,
rank() OVER (PARTITION BY depname ORDER BY salary DESC)
FROM empsalary;
窗口函数结合where子句使用示例
SELECT depname, empno, salary, enroll_date
FROM
(SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC,
empno) AS pos
FROM empsalary
) AS ss
WHERE pos < 3;
当一个查询涉及多个窗口函数时,可以用一个单独的OVER子句写出每个窗口函数,但如果多个函数需要相同的窗口行为,这是重复的和容易出错的。相反,每个窗口行为都可以在窗口子句中命名,然后在OVER中引用。例如
SELECT sum(salary) OVER w, avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);