我有一个表,其中包含公交系统的停车时间。详细信息并不重要,但是我的表基本上是这样的:
我正在从CSV文件导入数据,该文件包含除下一个停靠站ID之外的所有内容。我想生成“下一站ID”以加快我将在我的应用程序中进行的数据处理。
对于每一行,下一个停靠站ID应该是下一行的停靠站ID,并具有匹配的出行ID和服务ID。排序应基于停止顺序,该顺序将增加,但不一定是顺序(1、20、21、23等,而不是1,2,3,4 ...)。
这是我希望它看起来像的一个例子。为简单起见,我将所有服务ID保持不变,并且有两个Trip ID。如果没有下一站,我希望该条目为空白。
我认为完全在SQL中执行此操作是有意义的,但是我不确定如何做到最好。我知道如何用标准的编程语言(而不是SQL)来实现。谢谢您的帮助。
答案 0 :(得分:1)
您可以使用lead()
:
select
t.*,
lead(stop_id)
over(partition by trip_id, service_id order by stop_sequence) next_stop_id
from mytable t
以实际方式存储派生的信息不一定是一个好主意,因为您可以在需要时进行动态计算(可以将查询放在一个视图中以使其更易于访问)。但是,如果您想在update
中使用它,那么假设stop_id
是表的主键,则看起来像这样:
update mytable
set next_stop_id = t.next_stop_id
from (
select
stop_id,
lead(stop_id) over(partition by trip_id, service_id order by stop_id) next_stop_id
from mytable
) t
where mytable.stop_id = t.stop_id