0

我有以下问题:我有一个带有顶点和边的网络,车辆在上面移动。每次车辆到达顶点时,当前时间戳以及顶点和车辆 ID 都会记录到数据库中。我需要一个表格,其中包含车辆在两个顶点之间所需的时间差。

注意:条目是按时间戳升序记录的,但不一定是 car_ids 或crossing_ids。

例子:

|  ID  | Car_id  | Crossing_id  |     TIMESTAMP       |
|   1  |    1    |      1       | 2010-09-25 05:20:00 |
|   2  |    1    |      2       | 2010-09-25 05:23:00 |
|   3  |    2    |      1       | 2010-09-25 05:25:00 |
|   4  |    1    |      3       | 2010-09-25 05:35:00 |
|   5  |    2    |      5       | 2010-09-25 05:42:00 |

想要的结果:

| Car_id  | Crossing_id_start |   Timestamp_start   | Crossing_id_end |    Timestamp_end    |
|   1     |         1         | 2010-09-25 05:20:00 |         2       | 2010-09-25 05:23:00 |
|   1     |         2         | 2010-09-25 05:23:00 |         3       | 2010-09-25 05:35:00 |
|   2     |         1         | 2010-09-25 05:25:00 |         5       | 2010-09-25 05:35:00 |

示例测试数据:

DROP TABLE IF EXISTS "test";
CREATE TABLE "test" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , "car_id" TEXT NOT NULL , "crossing_id" TEXT NOT NULL , "time" DATETIME);
INSERT INTO "test" VALUES(1,'car_1','crossing_1','2010-09-25 05:20:00');
INSERT INTO "test" VALUES(2,'car_1','crossing_2','2010-09-25 05:23:00');
INSERT INTO "test" VALUES(3,'car_2','crossing_1','2010-09-25 05:25:00');
INSERT INTO "test" VALUES(4,'car_1','crossing_3','2010-09-25 05:35:00');
INSERT INTO "test" VALUES(5,'car_2','crossing_5','2010-09-25 05:42:00');

任何帮助是极大的赞赏; 最喜欢的是 sqlite,但也欢迎任何关于其他 sql 数据库的提示!

提前致谢, 杉

4

2 回答 2

0

一种可能的解决方案,如果您知道数字将是连续的

select 
  t1.ID as Car_id, 
  t1.Crossing_id as Crossing_id_start, 
  t1.TIMESTAMP as Timestamp_start, 
  t2.Crossing_id as Crossing_id_end, 
  t2.TIMESTAMP as Timestamp_end
from table t1
join table t2 on t1.ID = t2.ID and t1.Crossing_id = t2.Crossing_id + 1
order by Crossing_id_start, Crossing_id_end
于 2012-05-09T22:56:29.347 回答
0

我没有确切的 sqlite 语法,但我会分两步解决这个问题......

  1. 按您需要的顺序将数据放入游标或临时表中

    SELECT Car_id, Crossing_id, TIMESTAMP FROM Example ORDER BY Car_id ASC, Crossing_id ASC

  2. 迭代新表中填入crossing_id_start和crossing_id_end的行,其中crossing_id_start变成crossing_id_end,只要当前记录的car_id与前一条记录相同。

于 2012-05-09T22:51:36.330 回答