2017-04-05 44 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'