首页 > 解决方案 > SQL:使用带有 OVER() 语句的 WHERE 过滤表

问题描述

我正在使用 SQL Server,我的exampleTable数据库中有下表:

示例组 示例名称 示例值
一个 名称1 100
名称2 500
C 名称3 300
名称4 700
一个 名称5 500
C 名称6 600

我的目标是返回以下结果,其中我在附加列中有每组的平均值,并且仅显示行,其中 exampleValue 大于 GroupAvg:

示例组 示例名称 示例值 组平均值
一个 名称5 500 300
名称4 700 600
C 名称6 600 450

到目前为止我尝试了什么(错误:)Windowed functions can only appear in the SELECT or ORDER BY clauses.

SELECT 
    exampleGroup, exampleName , exampleValue,
    AVG(exampleValue) OVER (PARTITION BY exampleGroup) AS AvgGroup
FROM exampleTable
WHERE exampleValue> AVG(exampleValue) OVER (PARTITION BY exampleGroup);

标签: sqlsql-server

解决方案


你需要一个子查询:

SELECT c.*
FROM (SELECT Continent, Name, SurfaceArea,
             AVG(SurfaceArea) OVER (PARTITION BY Continent) AS AvgPerContinent
      FROM country c
     ) c
WHERE SurfaceArea > AvgPerContinent;

WHERE子句中不允许使用窗口函数。原因很简单:如果你有多个WHERE条件,窗口函数是在其他过滤器之前处理还是在之后处理?无需回答:语法不允许。


推荐阅读