mysql添加数字类别的列,根据另一列的值和位置进行增量

xjreopfe  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(266)

我在mysql中有一个表,如下所述

rownum,value,status
1,16,1
2,32,1
3,16,1
4,23,0
5,33,0
6,16,0
7,22,0
8,13,1
9,43,1
10,32,1
11,45,0
12,28,0
13,23,0
14,28,0
15,31,1
16,13,1
17,44,1

这里第三列显示了我想添加一个新列的行基础的状态。所需的逻辑是,对于“status”列中的每一组重复值1,新列将获得一个分配给所有这些行的数字。当找到下一组1时,这个数字将以+1递增。输出表如下所示。

rownum,value,status,category
1,16,1,1
2,32,1,1
3,16,1,1
4,23,0,null
5,33,0,null
6,16,0,null
7,22,0,null
8,13,1,2
9,43,1,2
10,32,1,2
11,45,0,null
12,28,0,null
13,23,0,null
14,28,0,null
15,31,1,3
16,13,1,3
17,44,1,3

我对如何创建这个逻辑有点困惑,任何输入都会非常有用。谢谢!

ygya80vv

ygya80vv1#

您可以在mysql中使用用户定义的会话变量和条件函数(如 If() . 我们将前一行的状态值存储在 @stat 变量,并将其与当前行的状态值进行比较,以获得预期的结果。
但是,如果只是为了显示,您应该认真考虑在应用程序代码中提交它。
不过,请尝试以下查询(db fiddle demo):

SELECT 
  IF( dt.status = 0, 
      NULL, 
      IF( @stat = 0, @cat := @cat + 1, @cat )
    ) AS category, 
  dt.rownum, 
  dt.value, 
  @stat := dt.status AS status 
FROM 
(
 SELECT 
   rownum, 
   value, 
   status 
 FROM your_table
 ORDER BY rownum ASC 
) AS dt 
CROSS JOIN (SELECT @cat := 0, 
                   @stat := 0) AS init_user_vars

相关问题