0

我正在尝试通过添加一列并标记一些行以指示它们是每次旅行的最后一站来改进运输调度表。

每个行程将有许多行显示其停靠点及其沿行程的顺序。如果序列号是该行程的最高值,我想用“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
4

2 回答 2

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)
于 2013-02-13T08:22:53.430 回答
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
    )
)

我会用元组语法写这个,但 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 回答