繁体   English   中英

SQL:使用带有 OVER() 语句的 WHERE 过滤表

[英]SQL: Filtering a table using WHERE with an OVER() statement

我正在使用 SQL 服务器,我的数据库中有下表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);

你需要一个子查询:

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

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

您不能在 where 子句中使用 window function。 但是您可以在子查询中使用它,如下所示:

select * from 
(
  SELECT 
    Continent, Name, SurfaceArea,
    AVG(SurfaceArea) OVER (PARTITION BY Continent) AS AvgPerContinent,
    AVG(SurfaceArea) OVER (PARTITION BY Continent) AS avgSurfaceArea
  FROM country
)t
where SurfaceArea>avgSurfaceArea

从您的示例表中:

create table exampleTable(  exampleGroup varchar(20),exampleName    varchar(20),exampleValue int);
insert into exampleTable values('A',    'name1' ,100);
insert into exampleTable values('B',    'name2' ,500);
insert into exampleTable values('C',    'name3' ,300);
insert into exampleTable values('B',    'name4' ,700);
insert into exampleTable values('A',    'name5' ,500);
insert into exampleTable values('C',    'name6' ,600);

select * from 
(
  SELECT 
    examplegroup, examplename, examplevalue,
    AVG(examplevalue) OVER (PARTITION BY examplegroup) AS groupavg
  FROM exampleTable
)t
where examplevalue>groupavg
GO 
示例组 示例名称 示例值 组平均
一个 名称5 500 300
名称4 700 600
C 名称6 600 450

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM