sql - 根据其他记录更新记录

标签 sql sql-server t-sql

我有一个这样的表,我想更新AttemptNumber的值基于记录的列,其值基于前一条记录。

<表类=“s-表”> <标题> txnId 用户ID 重试 尝试次数 <正文> 1 12 错误 0 2 12 正确 1 3 12 正确 2 4 12 错误 0 5 12 正确 1 6 12 正确 2 7 12 错误 0

每当我遇到Retry值为“False”,那么我想保留 AttemptNumber0 .

每当我遇到Retry值为“True”,那么我想增加 AttemptNumber 中的值。 目前表中没有 AttemptNumber 列,我将创建该列并根据“重试”中存在的值更新值。

最佳答案

您需要根据 Retry 中的值定义组。列并对行进行适当编号:

测试数据:

SELECT *
INTO Data
FROM (VALUES
   (1, 12, 'False', 0),
   (2, 12, 'True',  0),
   (3, 12, 'True',  0),
   (4, 12, 'False', 0),
   (5, 12, 'True',  0),
   (6, 12, 'True',  0),
   (7, 12, 'False', 0)
) v (TxnId, UserId, Retry, AttemptNumber)

声明:

; WITH UpdateCTE AS (
   SELECT 
      TxnId, UserId, Retry, AttemptNumber,
      ROW_NUMBER() 
         OVER (PARTITION BY UserId, GroupId ORDER BY TxnId) - 1 AS NewAttemptNumber
   FROM (
      SELECT 
         *,
         SUM(CASE WHEN Retry = 'False' THEN 1 ELSE 0 END) 
            OVER (PARTITION BY UserId ORDER BY TxnId) AS GroupId
      FROM Data
   ) t  
)
UPDATE UpdateCTE
SET AttemptNumber = NewAttemptNumber

结果:

<表类=“s-表”> <标题> TxnId 用户ID 重试 尝试次数 <正文> 1 12 错误 0 2 12 正确 1 3 12 正确 2 4 12 错误 0 5 12 正确 1 6 12 正确 2 7 12 错误 0

关于sql - 根据其他记录更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71419501/

相关文章:

php - 如何在此循环中跳过空结果或错误?

SQL查询可预订房间

sql-server - 如何使用sqoop将数据导出到具有自动增量ID的Microsoft Sql Table?

sql-server - Windows 更新后 SQL Server Management Studio 失败

sql - Group By 返回两行而不是预期的一行

sql - 将所有记录放在一个字段中

SQL统计每个部门的不同工作

php - mysqli_query 给出空值

sql-server - 在 SQL Server 2008 R2 脚本向导中缺少脚本数据

用于检测特定 deviceId 缺失事件事件的 Azure 流分析查询