sql - 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);
解决方案
你需要一个子查询:
SELECT c.*
FROM (SELECT Continent, Name, SurfaceArea,
AVG(SurfaceArea) OVER (PARTITION BY Continent) AS AvgPerContinent
FROM country c
) c
WHERE SurfaceArea > AvgPerContinent;
WHERE
子句中不允许使用窗口函数。原因很简单:如果你有多个WHERE
条件,窗口函数是在其他过滤器之前处理还是在之后处理?无需回答:语法不允许。
推荐阅读
- python - 如何访问列内列表中的元素?
- mysql - MySQL 接收器连接器 - JsonConverter - DataException:未知模式类型:null
- git - Git找到第一个非本地提交
- minikube - 代理后面的 minikube 启动不起作用
- node.js - TypeError:无法读取未定义的属性“url”-ws
- javascript - 重新定义 Date() javascript
- c++ - 为什么在 make build 后使用 !{cmd} 在 vim 中执行 c++ 编译文件时会输出 ^[[I 到终端
- flutter - 使用脚本 ('domainname/firebase-messaging-sw.js') 为范围 ('domainname') 注册 ServiceWorker 失败;在颤振网络上
- android - 想要将 recyclerview SQLite 数据传递给另一个片段并更新它?
- sql - 在 postgres 中执行 where 和 order by 查询时的奇怪行为