2012-10-24 71 views
3

我有以下查詢:順序排在PostgreSQL的

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(其中包括一個路由ID的把所有經度/緯度值,observation_time,緯度,和lon列),將它們按routeid分組,並按照觀察時間在每個組內對它們進行排序。但是,上面的SQL無效,因爲observation_time出現在ORDER BY子句中,而不出現在GROUP BY中。當我將observation_time添加到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中的組內實現行的這個順序?

+0

'爲了通過observation_time,LON,lat'相反,也許? postgres似乎沒有string_agg函數的排序選項,就像myqsl爲group_concat所做的那樣。 –

+0

Thanks @Marc - 事實證明,postgres實際上有一種方法來排序string_agg的東西,這正是我需要看的地方! – TheOx

+0

猜測我正在看的PG9.0文檔沒有提及按順序排列的選項。很高興知道它在那裏。 –

回答

4

由於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;