【问题标题】:Add column to SQL Table based on other rows in the table根据表中的其他行向 SQL 表中添加列
【发布时间】:2020-08-03 12:28:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 将信息以缓存的形式存储不是很好吗? (该表有数百万行 - 处理它可能需要一段时间)因为这些数据不会改变 - 它只会在我上传新的 CSV 时改变,我认为存储它会很好。但我也认为在 SQL 服务器之上放置一个缓存可以解决这个问题。
    • @danielhep:是的,如果您有数百万行并且您的数据在加载后没有更改,那么存储它可能会更好。
    • 刚刚试用过,效果很好。非常感谢!我会考虑缓存视图中的结果,否则我只会存储数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多