1

次の PostgreSQL クエリを使用して、異なるソース ID で終了時刻と次の開始時刻の時間差を見つけました。

SELECT obu_id, trip_id, start_time, end_time, dwell_time
     , end_time - LEAD(start_time) OVER(PARTITION BY obu_id ORDER BY start_time) AS diff 
 FROM clean_trips_byobu;

私がやろうとしているのは、diff(一時的な結果、どこにも保存されていない)に表示される結果で列のdwell_timeを更新し、空のスペースの代わりに値「-1」を挿入することです。次のスクリーンショットを参照してください。

スクリーンショット

望ましい結果:

obu_id trip_id  start_time            end_time              dwell_time  diff
2      135736   2004-10-29 15:22:14   2004-10-29 16:13:37   -02:01:42   -02:01:42
2      135738   2004-10-29 18:15:19   2004-10-29 18:28:37   -1
3      137826   2005-03-17 17:56:41   2005-03-17 18:02:31   -00:05:30   -00:05:30 
3      137826   2005-03-17 18:08:01   2005-03-17 18:12:10   -00:07:51   -00:07:51
3      137826   2005-03-17 18:20:01   2005-03-17 18:27:51   -14:51:24   -14:51:24
4

1 に答える 1

1

あなたが何を求めているのか、私の経験に基づいた推測:

UPDATE clean_trips_byobu c
SET    dwell_time = COALESCE(u.diff, interval '-1 hour')
FROM  (
   SELECT id, ref, start_time, end_time
        , end_time - lead(start_time) OVER (PARTITION BY id ORDER BY start_time) AS diff
   FROM   clean_trips_byobu
   ) u
WHERE (c.id, c.ref, c.start_time, c.end_time)
    = (u.id, u.ref, u.start_time, u.end_time)
AND c.dwell_time IS DISTINCT FROM COALESCE(u.diff, interval '-1 hour');
  • デフォルトCOALESCE()に置き換えるために使用します。NULLinterval
  • でクエリをサブクエリとして使用しますUPDATE。列の一意のセットで結合します。
  • にすでに値がある場合はdiff、空の更新を防ぐために最後の行を追加します。

4 つの列の組み合わせよりも行を識別する簡単な方法が必要です。代理主キーをお勧めします。次の 1 行のコードで実行できます。

ALTER TABLE clean_trips_byobu ADD COLUMN ctb_id serial PRIMARY KEY;

見る:

于 2013-06-27T05:19:29.293 に答える