0

列を追加し、いくつかの行にフラグを付けて、各旅行の最後の停車地であることを示すことにより、トランジットスケジューリングテーブルを改善しようとしています。

各旅行には、旅行に沿った停車地とその順序を示す多くの行があります。シーケンス番号がそのトリップで最大の場合、LastStop列を「1」で更新したいと思います。

次のSQLは正しい方向に進んでいると思いますが、「そのような列はありません:s1.stop_sequence」が表示されているので、この明らかでないエラーが解決されるまで、正しい方向に進んでいるかどうかわかりません。私は初心者レベルをかろうじて超えた軽量のSQLです。Stop_Sequenceは間違いなく列の正しい名前です。

UPDATE stop_times
   SET LastStop = '1'
 WHERE stop_sequence =(
             SELECT max(st.stop_sequence)
           FROM stop_times s1
          WHERE s1.trip_id = trip_id
       )
       AND
       trip_id = s1.trip_id
       AND
       stop_ID = s1.stop_id;

サンプルデータの簡略版を以下に示します。

TripID  Stop    Sequence LastStop
665381  1766    1
665381  3037    2
665381  3038    3          1
667475  1130    1
667475  2504    2          1
644501  2545    1
644501  3068    2
644501  2754    3
644501  3069    4
644501  2755    5          1
4

2 に答える 2

0

外部クエリからサブクエリの列を参照することはできません。さらに、フィルタが重複しているため、trip_id = s1.trip_idフィルタを適用したくないとします。これにより、旅行の他の停車地が見えなくなるからです。stop_idMAX

これを試して:

UPDATE stop_times
SET LastStop = '1'
WHERE Stop_Sequence = (SELECT MAX(Stop_Sequence)
                       FROM stop_times s1
                       WHERE s1.Trip_ID = stop_times.Trip_ID)

または、最後のストップとは、同じトリップ内でこれより大きなシーケンス番号を持つストップが他に存在しないストップです。

UPDATE stop_times
SET LastStop = '1'
WHERE NOT EXISTS (SELECT 1
                  FROM Stop_Sequence s1
                  WHERE s1.Trip_ID = stop_times.Trip_ID
                    AND s1.Stop_Sequence > stop_times.Stop_Sequence)
于 2013-02-13T08:22:53.430 に答える
0

これは、stops フィールドが常に 1000 未満である限り機能します (そうであれば、より大きな乗数を使用してください)。

UPDATE stop_times
SET laststop = 1
WHERE tripid*1000+sequence IN (
    SELECT tripid*1000+sequence FROM (
        SELECT tripid, max(sequence) AS sequence
        FROM stop_times
        GROUP BY 1
    )
)

タプル構文を使用してこれを記述しますが、SQLite はそれをサポートしていません。

UPDATE stop_times
SET laststop = 1
WHERE (tripid, sequence) IN (
    SELECT (tripid, sequence) FROM (
        SELECT tripid, max(sequence) AS sequence
        FROM stop_times
        GROUP BY 1
    )
)

申し訳ありませんが、SQLFiddle はありません。今日はうまくいかないようです。

于 2013-02-13T08:37:46.737 に答える