MySQL 添加数字类别的列,根据另一个列值和位置递增
MySQL add column with numeric category taking an increment based on another column value and position
我在 MySQL 中有一个 table,如下所述
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。输出 table 应如下所示。
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
我对如何创建这个逻辑有点困惑,任何输入都会很有帮助。谢谢!
您可以在 MySQL 中使用 User-defined Session variables, and using conditional functions like 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
我在 MySQL 中有一个 table,如下所述
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。输出 table 应如下所示。
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
我对如何创建这个逻辑有点困惑,任何输入都会很有帮助。谢谢!
您可以在 MySQL 中使用 User-defined Session variables, and using conditional functions like 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