我有一个可以正常运行的MySQL查询,但是现在我们正在迁移到Postgres,由于MySQL中使用了变量,它无法正常工作。查询如下:
SELECT COUNT
(
((
speed / 3.6 - prevspeed / 3.6
) / TIMESTAMPDIFF ( SECOND, prevdatenew, servertime )) / 9.80665
) AS hardAccels
FROM
(
SELECT ID
,
servertime,
@prevDateNew AS prevdatenew,
@prevDateNew := servertime,
speed,
@prevSpeed AS prevspeed,
@prevSpeed := speed
FROM
tc_positions
WHERE
deviceid = 32
AND ` ID ` BETWEEN 1318429
AND 1322230
) t1
WHERE
((
speed / 3.6 - prevspeed / 3.6
) / TIMESTAMPDIFF ( SECOND, prevdatenew, servertime )) / 9.80665 > 0.255;
这将返回错误,因为它无法识别mysql中使用的变量:
ERROR: syntax error at or near ":="
LINE 9: @prevDateNew:=servertime,
^
有什么办法解决这个问题吗?
答案 0 :(得分:2)
您正在使用变量访问上一行的值。对于PostgreSQL,您应该使用ANSI SQL标准函数lag
。此功能是窗口功能,因此您必须指定顺序。我没有您的数据,您的表,所以下面的查询只是为了启发
SELECT speed - lag(speed,1) OVER (ORDER BY id) /
EXTRACT(epoch FROM (
servertime - lag(servertime, 1) OVER (ORDER BY id)))
FROM tc_positions
...
关于该主题的不错的文章是http://www.postgresqltutorial.com/postgresql-window-function/