我有一个这样的表,我想用基于上一条记录的值更新基于记录的AttemptNumber列的值.

txnId UserId Retry AttemptNumber
1 12 False 0
2 12 True 1
3 12 True 2
4 12 False 0
5 12 True 1
6 12 True 2
7 12 False 0

每当我遇到Retry值为'False'时,我希望将AttemptNumber保持为0.

每当我遇到Retry的值为'True',那么我想增加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

结果:

TxnId UserId Retry AttemptNumber
1 12 False 0
2 12 True 1
3 12 True 2
4 12 False 0
5 12 True 1
6 12 True 2
7 12 False 0

Sql相关问答推荐

基于列对多行求和的查询

出现5次后,将所有正斜杠替换为连字符

在请求结束之前,PostgreSQL不会考虑使用中的删除

Postgres:对包含数字的字符串列表进行排序

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

对列进行排序后,基于两列删除重复行

从数据库中查找总和大于或等于查询中的数字的数字

每个学校 Select N个最新的行,但跳过同一学生的重复行

其中使用表名作为;行值;记录?

Select 最频繁的值以及分组依据

按二维数组的第一个元素排序

如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

如何将输出转换为二维格式?

根据是否存在值组合分组并 Select 行

我需要遍历权重值表并确定每个权重是否有效

SQL Select 最大并获取列名

具有日期时间条件的存储过程

在 MySql 数据库中的两个日期之间搜索

如何在 Oracle 中获取此变量的值?

如何刷新在视图之上创建的表