我在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
我对如何创建此逻辑有点困惑,任何输入都将非常有帮助。谢谢!
您可以使用用户定义的会话变量以及If()
等条件函数在MySQL中实现此目的。我们将上一行的状态值存储在变量@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