SQL 请求中的语法错误“... OVER ... ORDER BY... BETWEEN...”(旧版本与新版本)
Syntax error in SQL request "... OVER ... ORDER BY... BETWEEN..." (older versus new version)
我正在尝试制作一个移动平均线,将行的值与我的 SQL table.
的“值”列中的前 9 个值进行平均
基本上,我有这样的东西:
dateEvent values
2021-07-05 06:00:10 2.0
2021-07-05 14:00:10 3.0
2021-07-05 20:00:10 4.0
2021-07-06 06:00:10 3.0
2021-07-06 14:00:10 1.0
2021-07-06 20:00:10 5.0
2021-07-07 06:00:10 4.0
2021-07-07 14:00:10 2.0
2021-07-07 20:00:10 3.0
2021-07-08 06:00:10 3.0
2021-07-08 14:00:10 3.0
2021-07-08 20:00:10 6.0
2021-07-09 06:00:10 3.0
2021-07-09 14:00:10 3.0
2021-07-09 20:00:10 5.0
2021-07-10 06:00:10 2.0
2021-07-10 14:00:10 3.0
2021-07-10 20:00:10 1.0
我想:
dateEvent values averageValues averagePerDay
2021-07-05 06:00:10 2.0 2.0
2021-07-05 14:00:10 3.0 2.5 2.50
2021-07-05 20:00:10 4.0 3.0
2021-07-06 06:00:10 3.0 3.0
2021-07-06 14:00:10 8.0 4.0 3.60
2021-07-06 20:00:10 4.0 4.0
2021-07-07 06:00:10 2.0 3.7
2021-07-07 14:00:10 2.0 3.5 3.54
2021-07-07 20:00:10 3.0 3.44
2021-07-08 06:00:10 3.0 3.4
2021-07-08 14:00:10 3.0 3.5 3.57
2021-07-08 20:00:10 6.0 3.8
2021-07-09 06:00:10 3.0 3.7
2021-07-09 14:00:10 3.0 3.7 3.60
2021-07-09 20:00:10 5.0 3.4
2021-07-10 06:00:10 2.0 3.2
2021-07-10 14:00:10 3.0 3.3 3.23
2021-07-10 20:00:10 1.0 3.2
我在本地服务器(最新版本)上使用没有问题:
SELECT *,
(CASE WHEN COUNT(*)
OVER(ORDER BY dateEvent ROWS BETWEEN 10 PRECEDING AND 0 FOLLOWING) > 10
THEN AVG(values)
OVER(ORDER BY ID ROWS BETWEEN 10 PRECEDING AND 0 FOLLOWING)
ELSE values
END)
AS 'averageValues' FROM f16
group by CAST(dateEvent AS DATE)
但是,在我的旧服务器上(我没有更新它的权限),它在第 3 行围绕“OVER(ORDER BY ...”)给我一个语法错误。
有什么问题吗?我尝试了其他不同的方法,但其中 none 行得通。我对其他方式持开放态度,但我认为我很接近。只是一个小语法问题。
非常感谢
I'm trying to average the last 10 values from column "values" of my SQL table.
您可以使用子查询来做到这一点:
select avg(value)
from (select f16.*
from f16
order by dateEvent desc
limit 10
) f;
Window 您描述的问题不需要函数。
编辑:
根据您的评论:
select f16.*,
avg(value) over (order by dateevent rows between 10 preceding and current row) as avg_10
from f16;
Here 是一个 db<>fiddle.
我正在尝试制作一个移动平均线,将行的值与我的 SQL table.
的“值”列中的前 9 个值进行平均基本上,我有这样的东西:
dateEvent values
2021-07-05 06:00:10 2.0
2021-07-05 14:00:10 3.0
2021-07-05 20:00:10 4.0
2021-07-06 06:00:10 3.0
2021-07-06 14:00:10 1.0
2021-07-06 20:00:10 5.0
2021-07-07 06:00:10 4.0
2021-07-07 14:00:10 2.0
2021-07-07 20:00:10 3.0
2021-07-08 06:00:10 3.0
2021-07-08 14:00:10 3.0
2021-07-08 20:00:10 6.0
2021-07-09 06:00:10 3.0
2021-07-09 14:00:10 3.0
2021-07-09 20:00:10 5.0
2021-07-10 06:00:10 2.0
2021-07-10 14:00:10 3.0
2021-07-10 20:00:10 1.0
我想:
dateEvent values averageValues averagePerDay
2021-07-05 06:00:10 2.0 2.0
2021-07-05 14:00:10 3.0 2.5 2.50
2021-07-05 20:00:10 4.0 3.0
2021-07-06 06:00:10 3.0 3.0
2021-07-06 14:00:10 8.0 4.0 3.60
2021-07-06 20:00:10 4.0 4.0
2021-07-07 06:00:10 2.0 3.7
2021-07-07 14:00:10 2.0 3.5 3.54
2021-07-07 20:00:10 3.0 3.44
2021-07-08 06:00:10 3.0 3.4
2021-07-08 14:00:10 3.0 3.5 3.57
2021-07-08 20:00:10 6.0 3.8
2021-07-09 06:00:10 3.0 3.7
2021-07-09 14:00:10 3.0 3.7 3.60
2021-07-09 20:00:10 5.0 3.4
2021-07-10 06:00:10 2.0 3.2
2021-07-10 14:00:10 3.0 3.3 3.23
2021-07-10 20:00:10 1.0 3.2
我在本地服务器(最新版本)上使用没有问题:
SELECT *,
(CASE WHEN COUNT(*)
OVER(ORDER BY dateEvent ROWS BETWEEN 10 PRECEDING AND 0 FOLLOWING) > 10
THEN AVG(values)
OVER(ORDER BY ID ROWS BETWEEN 10 PRECEDING AND 0 FOLLOWING)
ELSE values
END)
AS 'averageValues' FROM f16
group by CAST(dateEvent AS DATE)
但是,在我的旧服务器上(我没有更新它的权限),它在第 3 行围绕“OVER(ORDER BY ...”)给我一个语法错误。
有什么问题吗?我尝试了其他不同的方法,但其中 none 行得通。我对其他方式持开放态度,但我认为我很接近。只是一个小语法问题。
非常感谢
I'm trying to average the last 10 values from column "values" of my SQL table.
您可以使用子查询来做到这一点:
select avg(value)
from (select f16.*
from f16
order by dateEvent desc
limit 10
) f;
Window 您描述的问题不需要函数。
编辑:
根据您的评论:
select f16.*,
avg(value) over (order by dateevent rows between 10 preceding and current row) as avg_10
from f16;
Here 是一个 db<>fiddle.