从SQL(postgres)中的签入列表生成路由

时间:2014-02-10 17:16:17

标签: sql postgresql

我的表:checkins(userid,time,venueid)

问题:生成表示用户行进路线的“步骤”的视图

想法:生成形式为(A,B)的夫妻,其中A是签到,B是后续签到时间限制(同一天,B来自A)

什么行不通:现在我的查询生成查询,如(A,B1),(A,B2)...其中Bx是在A之后完成的签到。对于(A1,B)也是如此),(A2,B)......夫妻。

我需要的只是形式(A,B1)和(A1,B)的夫妇,它们代表路线中真正的后续“步骤”,如图中的弧,其中节点是原始的签到。< / p>

我当前结果的示例:http://i.imgur.com/6yIlxD8.png 前3行具有相同的arrival_time,而后2行具有相同的起始时间。我需要的只是第1行和第4行。

我的实际解决方案:http://pastebin.com/8PTDfM1K

1 个答案:

答案 0 :(得分:0)

您可以在WHERE中使用NOT EXISTS使用另一个条件,在同一个表中使用同一个表的第三个查询(请注意同一时间戳的多个签到!) ,或使用row_number()如下。

CREATE VIEW vw_checkins AS
SELECT
    userid,
    time,
    venueid,
    row_number() OVER (PARTITION BY userid ORDER BY time) as row_number
FROM "POIs"."test";

然后您可以按如下方式构建连接:

select A.userid, A."venueID", B."venueID", A.time as start_time, B.time as arrival_time
from vw_checkins as A, vw_checkins as B
where
    B.row_number = A.row_number + 1
    and date_trunc('day', A.time)=date_trunc('day', B.time)
    and A."venueID" <> B."venueID"
    and A.userid=B.userid;

请注意,我还将NOT LIKE替换为<>[NOT] LIKE需要时间,因此如果您不需要它,请将其删除(即正则表达式比较)。