我正在尝试通过添加列并标记某些行来改进传输调度表,以指示它们是每次旅行的最后一站。
每次旅行都会有很多行显示其行程中的停靠点和顺序。如果序列号是该行程的最高值,我想用“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 :(得分: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)
答案 1 :(得分: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
)
)
我会用tuple语法编写这个,但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 - 它似乎今天对我不起作用。