编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
select Distinct a.Num ConsecutiveNums from (
select t.Num ,
@cnt:=IF(@prev=t.Num,@cnt+1,1) cnt,
@prev:=t.Num
from Logs t,(select @prev:=null,@cnt:=0) r
) a where a.cnt>=3
语法解释:
1. IF(expr1, expr2, expr3) //三元表达式
2. @pre:=10 // 变量赋值语法
3. 使用select 语句设置变量,可看做表,在datagrip中直接运行可以显示为表
pre ==> 记录上一个值, cnt ==> 记录次数,
select @pre:=null, @cnt:=0
4. 如果pre与t.num 相等,则cnt加1, 否则cnt重置为1
@cnt:=IF(@pre=t.Num, @cnt+1, 1) cnt
5. 将生成的num与cnt次数的表,作为新的表 a
SELECT t.Num ,
@cnt:=IF(@pre=t.Num, @cnt+1, 1) cnt,
@pre:=t.Num pre
FROM Logs t, (SELECT @pre:=null, @cnt:=0) b) a