【问题标题】:TSQL - Updating a column value with ORDER BY till a certain column value is foundTSQL - 使用 ORDER BY 更新列值,直到找到某个列值
【发布时间】:2016-12-02 10:30:02
【问题描述】:

我有这张桌子:

ID - Uniqueidentifier
TYPEDUT_ID - Uniqueidentifer
OPERATION - Integer
ACTIVE - Integer (0/1)
CREATED - DateTime

我想对行ORDER BY CREATED DESC 进行排序并从上到下更新ACTIVE = 0,直到达到某个OPERATION。

样本数据:

            ID                                     TYPEDUT_ID                 OPERATION        ACTIVE             CREATED
ADFFC7CB-C938-448B-BF15-019C31434AFD    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2000             1         2016-09-06 13:06:29.333
CF7E2375-EC6E-416F-99E6-15213BD829D8    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    3000             1         2016-09-06 13:01:47.657
31189043-8B7E-4DCC-8EAC-62AD5EDB32E2    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2000             1         2016-09-06 13:10:07.720
E473B887-65DB-40FA-94D9-697F20E787B9    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2300             1         2016-09-06 13:30:41.227
1DD2C120-7859-4868-9C71-83F6BC3F7488    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    3100             1         2016-09-06 14:40:46.087
B27283A8-43DD-468E-95CB-99DD1BC95321    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2100             1         2016-09-06 13:23:34.883
103899E9-33B1-4FCA-AA1B-A51040B35FBD    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2400             1         2016-09-06 14:03:21.830

现在,如果我将 3000 作为我想要的操作,预期结果应该如下所示:

                   ID                              TYPEDUT_ID                 OPERATION  ACTIVE           CREATED
1DD2C120-7859-4868-9C71-83F6BC3F7488    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    3100       0       2016-09-06 14:40:46.087
103899E9-33B1-4FCA-AA1B-A51040B35FBD    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2400       0       2016-09-06 14:03:21.830
E473B887-65DB-40FA-94D9-697F20E787B9    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2300       0       2016-09-06 13:30:41.227
B27283A8-43DD-468E-95CB-99DD1BC95321    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2100       0       2016-09-06 13:23:34.883
31189043-8B7E-4DCC-8EAC-62AD5EDB32E2    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2000       0       2016-09-06 13:10:07.720
ADFFC7CB-C938-448B-BF15-019C31434AFD    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    2000       0       2016-09-06 13:06:29.333
CF7E2375-EC6E-416F-99E6-15213BD829D8    CC055EBE-2655-4B2F-B6C2-BF9BCE46941B    3000       1       2016-09-06 13:01:47.657

【问题讨论】:

  • 添加样本表数据和预期结果。同时向我们展示您当前的查询尝试。
  • @jarlh 已编辑!请看一下并尝试给出解决方案

标签: sql sql-server database tsql sql-query-store


【解决方案1】:

如果我理解正确,您可以使用子查询获得特定操作的最短创建时间。然后,您可以使用该信息来定义要更新的行:

update t
    set active = 0
    where created <= (select min(t2.created)
                      from t t2
                      where operation = @Operation
                     );

编辑:

显然,我是倒过来理解的。解决方案是另一种方式:

update t
    set active = 0
    where created >= (select max(t2.created)
                      from t t2
                      where operation = @Operation
                     );

【讨论】:

  • 老兄,它没有用。看看编辑。我添加了一些示例数据。假设所需的操作是 3000/2000,我想按日期 DESC 对数据进行排序,然后使 ACTIVE =0 直到达到 3000/2000。
  • 我认为 Gordon 弄错了 - 将 并将 min 更改为 max
  • @JamesCasey 太好了!它就像一个魅力!非常感谢:D
  • @TarekSaazeb 。 . .我很好奇。您是否有理由不接受此答案?
  • @GordonLinoff 再次接受了它。抱歉,这是一次误点击。
【解决方案2】:

由于您需要根据 Created 的降序对数据进行排序。我使用了一个临时表来存储排序后的数据。

 DECLARE @tempTable1 TABLE(Temp_Id INT IDENTITY(1,1),Id NVARCHAR(MAX),TYPEDUT_ID  NVARCHAR(MAX),OPERATION INT,ACTIVE INT,CREATED DATETIME)

    DECLARE @operation INT =3000
    INSERT INTO  @tempTable1(Id,TYPEDUT_ID,OPERATION,ACTIVE,CREATED) SELECT Id,TYPEDUT_ID,OPERATION,ACTIVE,CREATED FROM Table_Name ORDER BY CREATED DESC

    UPDATE @tempTable1
    SET active = 0
    WHERE operation != @operation

    SELECT * FROM @tempTable1

【讨论】:

  • 没关系,但这个解决方案也不起作用。它会将 ACTIVE=0 设置为除所需操作之外的每个操作。这不是我的意图。一旦达到所需的操作,该进程必须停止将 ACTIVE 更新为 0。
猜你喜欢
  • 1970-01-01
  • 2019-12-02
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多