2017-04-05 43 views
0

我有一張表(表A),它按時間記錄出租車訂單的每個出發地和目的地,現在我想查找第一個出發地(即第2行),然後將O和D逐行對直到最後一個目的地(即第9行),結果應該如表B.我如何實現它?如何使用PSQL將此表逐行分成兩部分?

image here

表A

Time GPS_Point     Status 
633  POINT(121.314917 31.149205) Destination 
62323 POINT(121.535798 31.25828) Origin 
62328 POINT(121.535798 31.25828) Destination 
62332 POINT(121.535798 31.25828) Origin 
62429 POINT(121.5358 31.258278) Destination 
62637 POINT(121.535788 31.25827) Origin 
62647 POINT(121.535788 31.25827) Destination 
62731 POINT(121.535795 31.25826) Origin 
62741 POINT(121.535795 31.25826) Destination 
62812 POINT(121.535793 31.25826) Origin 

表B

Origin_Time Origin_GPS_Point Destination_Time Destination_GPS_Point 
62323 POINT(121.535798 31.25828) 62328 POINT(121.535798 31.25828) 
62332 POINT(121.535798 31.25828) 62429 POINT(121.5358 31.258278) 
62637 POINT(121.535788 31.25827) 62647 POINT(121.535788 31.25827) 
62731 POINT(121.535795 31.25826) 62741 POINT(121.535795 31.25826) 
+0

下一次,請儘量把樣本數據的腳本和不(只)的圖像,並顯示您嘗試以獲得結果 – etsa

+0

@etsa謝謝,我已經添加了樣本數據作爲腳本。 –

+0

不客氣。爲了幫助我們提供幫助,我認爲如果您將發佈 - 針對您的下一個問題 - 創建並插入腳本,就像在我的答案中那樣,這將更容易... – etsa

回答

1

你可以試試這個(但假設一些概念,作爲Orig/Dest的順序沒有任何中斷)(我用一些假的值爲GPS_POINT,'O'爲原點,'D'爲目的地)。

CREATE TABLE TABLEA (TIME INT, GPS_POINT VARCHAR(10), STATUS VARCHAR(1)); 
    INSERT INTO TABLEA VALUES (633,'p1','D'); 
    INSERT INTO TABLEA VALUES (62323,'p2','O'); 
    INSERT INTO TABLEA VALUES (62328,'p3','D'); 
    INSERT INTO TABLEA VALUES (62332,'p4','O'); 
    INSERT INTO TABLEA VALUES (62429,'p5','D'); 
    INSERT INTO TABLEA VALUES (62637,'p6','O'); 
    INSERT INTO TABLEA VALUES (62647,'p7','D'); 
    INSERT INTO TABLEA VALUES (62650,'p8','O'); 

    SELECT ORIGIN_TIME, ORIGIN_GPS, DEST_TIME, DEST_GPS FROM 
    (SELECT TIME AS ORIGIN_TIME, GPS_POINT AS ORIGIN_GPS, ROW_NUMBER() OVER (ORDER BY TIME) AS RN_O 
    FROM TABLEA 
    WHERE STATUS='O') A 
    LEFT JOIN (SELECT TIME AS DEST_TIME, GPS_POINT AS DEST_GPS, ROW_NUMBER() OVER (ORDER BY TIME) AS RN_D 
       FROM TABLEA 
       WHERE STATUS='D' 
       AND TIME> (SELECT MIN(TIME) FROM TABLEA) 
       ) B ON A.RN_O = B.RN_D 
WHERE DEST_TIME IS NOT NULL /* IF YOU WANT OMITS LAST "O" ROW WITHOUT "D" */ 
    ; 

輸出:

origin_time origin_gps dest_time dest_gps 
1 62323 p2 62328 p3 
2 62332 p4 62429 p5 
3 62637 p6 62647 p7 
+0

謝謝,它似乎很好找到第一個來源,但它有一個問題找到最後的目的地。假設我添加了'INSERT INTO TABLEA VALUES(62650,'p8','O');'。輸出將有第4行:'4 62650 p8 - - ',但我希望這個單獨的O將被省略。 –

+0

看到我的編輯版本,但正如我告訴過你,你應該考慮/提出一些「要求」。 – etsa

+0

謝謝,它工作正常。對於這個問題,我可以使用矩陣操作來解決這個問題,但就使用查詢而言,這對我來說真的很有挑戰性。 –

0

使用此查詢:

select a.Time as 'Origin_Time', a.GPS_Point as 'Origin_GPS_Point', aa.Time as 'Destination_Time', aa.GPS_Point as 'Destination_GPS_Point' 
from TABLE_A a 
JOIN TABLE_A aa on a.GPS_Point=aa.GPS_Point and aa.Status='Destination' and a.Status='Origin'