将MySQL查询迁移到Postgres

时间:2019-11-01 22:51:39

标签: mysql postgresql

我有一个可以正常运行的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,
                                   ^

有什么办法解决这个问题吗?

1 个答案:

答案 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/