
[英]Best practice when filtering SQL results using OR in the WHERE part of the statement
[英]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.