4

我有以下查询:

SELECT
  routeid, 
  'SRID=4326;LINESTRING(' || string_agg(lon || ' ' || lat, ',') || ')' AS the_geom
FROM route_table 
WHERE observation_time BETWEEN '2012-09-12 10:00:00' AND '2012-09-12 10:15:00'
GROUP BY routeid HAVING COUNT(lon) > 1 ORDER BY observation_time ASC;

此查询的目标是从 route_table(由 routeid、observation_time、lat 和 lon 列组成)中提取所有 lon/lat 值,按 routeid 对它们进行分组,并按观察时间在每个组中对它们进行排序。但是,上面的 SQL 无效,因为 observation_time 出现在 ORDER BY 子句中,而不是出现在 GROUP BY 中。当我将观察时间添加到 GROUP BY 时,我没有得到正确的结果。

假设这样的数据集:

routeid | observation_time      | lat | lon
---------------------------------------------
    1   | '2012-09-12 01:00:00' | 30  | -75
    1   | '2012-09-12 01:05:00' | 31  | -76
    1   | '2012-09-12 01:10:00' | 31  | -76.5
    2   | '2012-09-12 01:03:00' | 39  | -22
    2   | '2012-09-12 01:00:00' | 40  | -22
    2   | '2012-09-12 01:06:00' | 41  | -22

输出应如下所示:

routeid | the_geom
--------------------------------------------------------
    1   | 'SRID=4326;LINESTRING('-75 30,-76 31,-76.5 31)
    2   | 'SRID=4326;LINESTRING('-22 40,-22 39,-22 41)

所以问题是:如何在 PostgreSQL 中实现组内行的这种顺序?

4

1 回答 1

6

感谢 MarcB 的评论,我意识到问题在于 string_agg 函数中的排序,所以解决方案是:

SELECT 
  routeid, 
  'SRID=4326;LINESTRING(' || string_agg(lon || ' ' || lat, ',' ORDER BY time ASC) || ')' AS the_geom
FROM route_table 
WHERE observation_time BETWEEN '2012-09-12 10:00:00' AND '2012-09-12 10:15:00'
GROUP BY routeid HAVING COUNT(lon) > 1;
于 2012-10-24T15:02:30.947 回答