根据表中的其他行向SQL表添加列

时间:2020-04-20 21:03:13

标签: sql database postgresql sql-update window-functions

我有一个表,其中包含公交系统的停车时间。详细信息并不重要,但是我的表基本上是这样的:

example of my table columns

我正在从CSV文件导入数据,该文件包含除下一个停靠站ID之外的所有内容。我想生成“下一站ID”以加快我将在我的应用程序中进行的数据处理。

对于每一行,下一个停靠站ID应该是下一行的停靠站ID,并具有匹配的出行ID和服务ID。排序应基于停止顺序,该顺序将增加,但不一定是顺序(1、20、21、23等,而不是1,2,3,4 ...)。

这是我希望它看起来像的一个例子。为简单起见,我将所有服务ID保持不变,并且有两个Trip ID。如果没有下一站,我希望该条目为空白。

table showing what I hope to accomplish

我认为完全在SQL中执行此操作是有意义的,但是我不确定如何做到最好。我知道如何用标准的编程语言(而不是SQL)来实现。谢谢您的帮助。

1 个答案:

答案 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