2013-02-13 84 views
0

我試圖通過添加一列並標記一些行來指示它們是每次旅程的最後一站來改進一個運輸計劃表。執行更新的SQLITE語法錯誤

每趟旅行都會有很多行顯示行程中的行程和順序。如果序列號是該行程中最高的,我想用'1'更新LastStop列。

我認爲以下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 
+0

查詢中和示例數據中的列名稱不匹配。別名是's1'還是'st'? – 2013-02-13 08:13:05

回答

0

您不能從外部查詢引用子查詢中的列。 此外,過濾器trip_id = s1.trip_id已複製,並且您不希望在stop_id上過濾,因爲這會阻止MAX查看此行的任何其他停靠站。

試試這個:

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) 
0

這會爲你工作的,只要停止字段始終是小於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 
    ) 
) 

我WOU LD寫這使用元組的語法,但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 - 它似乎並沒有今天爲我工作。