leetcode180连续出现的数字
(以下的值全为英文字符,中文冒号比较显眼,所以才在文中使用中文冒号)
前置知识点
@value:= null 表示为变量value赋值
是的,@xx表示一个变量,:=表示赋值
(select @valueA:=null,@valueB:=null)as t 给多个变量赋值
distinct 去重值,如果查询的列里的值有重复,那只输出一次
case when 相当于平常的switch函数了,基本语法如下
SELECT
sex as '性别',
CASE sex
WHEN sex='女' THEN
'女子团体'
WHEN '男' THEN
'男子团体'
ELSE
'无'
END as '所属项目'
FROM
paticipator;
需要注意的是,如果判断语句不是一个判断,而是一个值,那么默认是判断是否与case的值相等,
而且判断语句的相等用的是一个=,不是==。
回到题目
找出行的Num值连续相等次数超过2的值。
Logs 表:
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
我们先定义两个变量,一个记录上一行的值,一个记录当前累计的相同值的次数,初始值都为空
(select @pre := null,@count := null) as t
然后根据Num值,构造一列,专门记录与上一行相同的累计次数
select Num,
case
when @pre=Num then @count:=@count+1
when (@pre:=Num) is not null then @count:=1
end as CNT
from Logs
Logs 表:
+----+-----+-----+
| Id | Num | CNT |
+----+-----+-----+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 1 | 1 |
| 6 | 2 | 1 |
| 7 | 2 | 2 |
+----+-----+-----+
只取右边两行
最后查找CNT大于等于3的去重行值
完整代码如下
select distinct Num as ConsecutiveNums from
(
select Num,
case
when @pre=Num then @count:=@count+1
when (@pre:=Num) is not null then @count:=1
end as CNT
from Logs,
(select @pre := null,@count := null) as t
) as temp
where temp.CNT >= 3
这题还是有局限性的,只是求值,如果求满足的所有的行的其他信息就歇菜了。