首页 > 解决方案 > postgresql中group by的奇怪行为

问题描述

我不知道如何描述这种情况。我正在尝试使用 PostGIS 扩展从存储在 PotgreSQL 中的一组 GPS 点计算速度的最大值、平均值和最小值。

我写了以下查询:

WITH foo1 AS(
SELECT *,timestamp_epoch t2,  LAG(timestamp_epoch) OVER(PARTITION BY trip  ORDER BY timestamp_epoch) t1
,geom g2,  LAG(geom) OVER(PARTITION BY trip  ORDER BY timestamp_epoch) g1
FROM trips_points
--WHERE trip = 9
    )

 , speeds AS (
SELECT * ,t2-t1 delta_t, ST_Distance(g2,g1) dist, ((ST_Distance(g2,g1))/(t2-t1))*3.6 speed_km_per_h
FROM foo1

    )

   
 SELECT trip, AVG(speed_km_per_h), MIN(speed_km_per_h), MAX(speed_km_per_h), COUNT(speed_km_per_h)
 FROM speeds
 GROUP BY trip

我使用 LAG() 查找上一个 GPS 点,并使用 epoch 对类似于原始行程的点进行排序。然后,我使用先前的时间值和先前的几何图形来计算两点之间的速度。当我运行此查询时,我看到以下结果: 在此处输入图像描述

我看到第 9 次行程的最高速度是 192!当我检查这次旅行中的所有速度值时,我没有看到这个值!所以我想问题应该出在 MAX() 聚合函数上。然后,我通过在查询的第 5 行取消注释“WHERE trip = 9”,仅选择了第 9 次行程的点。然后令人惊讶的是,结果是正确的!

在此处输入图像描述

这是我在速度表中手动看到的正确最大值。我不明白这是怎么回事!!100个行程中,有5个有同样的问题,其他的都是对的!这里有什么问题?

标签: sqlpostgresqlgroup-bypostgis

解决方案


推荐阅读