首页 > 解决方案 > 根据表中的其他行向 SQL 表中添加列

问题描述

我有一张表,其中包含公交系统的停止时间。细节并不重要,但我的表格基本上是这样的:

我的表格列示例

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

对于每一行,下一站 ID 应该是下一行中与行程 ID 和服务 ID 匹配的站 ID。排序应基于停止序列,它将增加但不一定按顺序(1、20、21、23 等而不是 1、2、3、4...)。

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

表格显示我希望完成的事情

我认为完全在 SQL 中执行此操作是有意义的,但我不确定如何最好地执行此操作。我知道我会如何用标准编程语言做到这一点,但不知道 SQL。谢谢您的帮助。

标签: sqldatabasepostgresqlsql-updatewindow-functions

解决方案


您可以使用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

推荐阅读