Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:使用WHERE和OVER()语句筛选表_Sql_Sql Server - Fatal编程技术网

SQL:使用WHERE和OVER()语句筛选表

SQL:使用WHERE和OVER()语句筛选表,sql,sql-server,Sql,Sql Server,我正在使用SQL Server,我的数据库中有下表exampleTable: 示例组 示例名称 示例值 A. 名称1 100 B 姓名2 500 C 名字3 300 B 名字4 700 A. 名字5 500 C 名字6 600 您需要一个子查询: SELECT c.* FROM (SELECT Continent, Name, SurfaceArea, AVG(SurfaceArea) OVER (PARTITION BY Continent) AS AvgPerCon

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

示例组 示例名称 示例值 A. 名称1 100 B 姓名2 500 C 名字3 300 B 名字4 700 A. 名字5 500 C 名字6 600 您需要一个子查询:

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

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

不能在where子句中使用窗口函数。但您可以在子查询中使用它,如下所示:

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
从示例表中:

示例组 示例名称 示例值 集团平均 A. 名字5 500 300 B 名字4 700 600 C 名字6 600 450
不能在WHERE中使用聚合函数。您需要先使用CTE/子查询。谢谢!顺便说一句:对不起,我更正了我声明中的变量错误,现在应该更清楚了。对不起,我更正了我声明中的变量错误,现在应该更清楚了。很高兴知道你得到了答案。最好的智者。
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