首页 > 解决方案 > 更新 SQL Select 语句中每一行的变量

问题描述

我正在尝试根据不等于 1000 的最新代码更新列,如果有重复的 1000 代码,它们应该都更改为不等于 1000 的最新代码。

在 SQL Server 2012 中,我尝试了滞后语句,创建行 ID 并加入到同一个表 -1 行,这两者都可以工作,但问题是重复的。一行可以有很多 1000 个代码,但我需要保留时间戳并将它们全部更改为不等于 1000 的最新代码

SELECT
    EqmtID
    ,Reason
    ,StartTime

FROM cyclesRID

产生:

EqmtID                 Reason  StartTime
1903010010000030808    1007    23759
1903010010000030808    1005    24965
1903010010000030808    1000    25382
1903010010000030808    1000    26078
1903010010000030808    1000    27180
1903010010000030808    1000    27761
1903010010000025572    1004    8601

我需要编辑 select 语句以生成:

EqmtID                 Reason  StartTime
1903010010000030808    1007    23759
1903010010000030808    1005    24965
1903010010000030808    1005    25382
1903010010000030808    1005    26078
1903010010000030808    1005    27180
1903010010000030808    1005    27761
1903010010000025572    1004    8601

同样按 EqmtID 分区,如果分区的第一行有 1000 代码,则应更改为 1001。

如果我在 Python 中执行此操作,我将使用一个仅在不等于 1000 时才更新的变量。可以在 SQL 中完成类似的操作吗?

标签: sql-server-2012

解决方案


一种选择是使用相关子查询来查找1000 Reason要用于更新的最近的非代码:

UPDATE c1
SET Reason = (SELECT TOP 1 Reason FROM cyclesRID c2
              WHERE c2.EqmtID = c2.EqmtID AND
                    Reason <> 1000 AND c2.StartTime < c1.StartTime
              ORDER BY StartTime DESC)
FROM cyclesRID c1
WHERE Reason = 1000;

在此处输入图像描述

演示


推荐阅读