Postgresql 使用计算的距离更新同一个表

Postgresql 使用计算的距离更新同一个表,postgresql,gps,postgis,Postgresql,Gps,Postgis,这个问题与 我可以用新的条目计算距离,并将其插入到第四列,称为“距离”。但现在我需要进行更新查询,使用ST_距离计算现有GPS坐标的累进距离,并存储到距离列中。你知道如何用我现有的桌子设计来实现吗 在更新现有行的值时,您需要为每个设备\u id识别当前行之前的行。您可以通过一个窗口函数来实现这一点,通过device\u id对行进行分区,并通过“timestamp”进行排序,如下所示: UPDATE my_table SET distance = cum_dist FROM ( SELECT

这个问题与


我可以用新的条目计算距离,并将其插入到第四列,称为“距离”。但现在我需要进行更新查询,使用ST_距离计算现有GPS坐标的累进距离,并存储到距离列中。你知道如何用我现有的桌子设计来实现吗

在更新现有行的值时,您需要为每个
设备\u id
识别当前行之前的行。您可以通过一个窗口函数来实现这一点,通过
device\u id
对行进行分区,并通过
“timestamp”
进行排序,如下所示:

UPDATE my_table SET distance = cum_dist
FROM (
  SELECT dev, t, sum(d) OVER (PARTITION BY dev ORDER BY t) AS cum_dist
  FROM (
    SELECT mt.device_id AS dev, mt."timestamp" AS t,
           coalesce(ST_Distance(mt.GPS_location, lag(mt.GPS_location) OVER (PARTITION BY mt.device_id ORDER BY mt."timestamp")), 0.) AS d
    FROM my_table mt
  ) sub2
) sub
WHERE my_table.device_id = sub.dev
  AND my_table."timestamp" = sub.t;
几句解释:

  • 最里面的查询
    sub2
    计算到特定设备上一个GPS位置的距离。它使用来执行此操作,并使用
    coalesce()
    函数来确保序列中的第一个点的距离为
    0
    ,而不是
    NULL
  • 在下一个查询
    sub
    中,将再次使用窗口函数计算累积距离,但这次使用众所周知的聚合函数
    sum()
  • 然后,通过使用
    device\u id
    的“timestamp”
    列将查询链接到表,将累积距离“更新到”表中

与所有更新一样,首先运行查询以查看其生成的结果是否正确,然后执行
UPDATE

在更新现有行的值时,您需要为每个
设备\u id
标识当前行之前的行。您可以通过一个窗口函数来实现这一点,通过
device\u id
对行进行分区,并通过
“timestamp”
进行排序,如下所示:

UPDATE my_table SET distance = cum_dist
FROM (
  SELECT dev, t, sum(d) OVER (PARTITION BY dev ORDER BY t) AS cum_dist
  FROM (
    SELECT mt.device_id AS dev, mt."timestamp" AS t,
           coalesce(ST_Distance(mt.GPS_location, lag(mt.GPS_location) OVER (PARTITION BY mt.device_id ORDER BY mt."timestamp")), 0.) AS d
    FROM my_table mt
  ) sub2
) sub
WHERE my_table.device_id = sub.dev
  AND my_table."timestamp" = sub.t;
几句解释:

  • 最里面的查询
    sub2
    计算到特定设备上一个GPS位置的距离。它使用来执行此操作,并使用
    coalesce()
    函数来确保序列中的第一个点的距离为
    0
    ,而不是
    NULL
  • 在下一个查询
    sub
    中,将再次使用窗口函数计算累积距离,但这次使用众所周知的聚合函数
    sum()
  • 然后,通过使用
    device\u id
    的“timestamp”
    列将查询链接到表,将累积距离“更新到”表中

与所有更新一样,首先运行查询以查看其生成的结果是否正确,然后执行
UPDATE

我首先尝试使用select子句,但它缺少一个括号,我添加了一个带别名的括号,然后它抱怨设备id不存在。这就是alias的样子:从“my_table”mt)s)子部分,确实有一个括号和alias缺失;请参阅更新的答案。
device\u id
应该没有问题,但是添加了表限定符只是为了确保。您能再次检查吗?我首先尝试使用select子句,但它缺少一个括号,我添加了一个别名为的括号,然后它抱怨设备id不存在。这就是alias的样子:从“my_table”mt)s)子部分,确实有一个括号和alias缺失;请参阅更新的答案。
device\u id
应该没有问题,但是添加了表限定符只是为了确保。你能再查一下吗?