mysql - 将 MySQL 查询迁移到 Postgres

标签 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,
                                   ^

有什么解决办法吗?

最佳答案

您正在使用变量访问前几行的值。对于 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/

关于mysql - 将 MySQL 查询迁移到 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666742/

相关文章:

mysql - 使用 'with' 查询数据库并没有得到预期结果

mysql - 如何优化以下 SQL 查询?

postgresql - 如何在postgresql中正确选择字符变化数据

postgresql - Postgresql 中的存储过程中的表别名不存在架构

sql - 如何选择具有重复字段值的每一行

sql - ActiveRecord OR 运算符使查询速度减慢了 10 倍。为什么?

node.js - 避免 created_at 和 updated_at 由 sequelize 自动生成

mysql - 如何在 MySQL 中对以下日期进行分组

mysql - 在 Windows Phone 7 上使用 MySQL 数据库?

php - 根据条件按组格式化结果?