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でグループ化し、各グループ内で観測時間で並べ替えることです。ただし、observation_timeはGROUPBYではなくORDERBY句に表示されるため、上記のSQLは無効です。GROUP BYにobservation_timeを追加すると、正しい結果が得られません。

次のようなデータセットを想定します。

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 に答える