0

次の問題があります。車両が動き回る頂点とエッジを持つネットワークがあります。車両が頂点に到達するたびに、現在のタイムスタンプと頂点および車両 ID がデータベースに記録されます。車両が 2 つの頂点間で必要とする時間差を持つテーブルが必要です。

注: エントリはタイムスタンプの昇順でログに記録されますが、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

私は正確なsqlite構文を持っていませんが、これには2つのステップでアプローチします...

  1. 必要な順序でデータをカーソルまたは一時テーブルに入れます

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

  2. 現在のレコードの car_id が前のレコードと同じである限り、crossing_id_start が Crossing_id_end になる新しいテーブルで、crossing_id_start と Crossing_id_end を埋める行を反復処理します。

于 2012-05-09T22:51:36.330 に答える
0

番号が連続することがわかっている場合の1つの可能な解決策

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 に答える