SQL学习(5):连续出现的数字
1.题目描述
给出logs表(Id, num;Id为主键),查询至少连续出现3次的数字并返回
2.问题分析
1.分析
要点如下:连续出现;返回需要DISTINCT
2.完整代码
SELECT DISTINCT t.nums AS ConsecutiveNums
FROM
(SELECT nums,
LAG(nums,1) OVER(ORDER BY Id) AS last_nums,
LEAD(nums,1) OVER(ORDER BY Id) AS next_nums
FROM logs) AS t
WHERE t.nums=t.last_nums AND t.nums=t.next_nums
3.知识点总结
- MySQL中子查询需要重命名
- 连续出现:使用LAG和LEAD函数。可以使用2个LAG、2个LEAD或1个LAD和1个LEAD。
- 连续出现N次和出现N次:
-
连续问题:
由于存在顺序问题,连续出现N次需要保持原表格的数据顺序,通常使用LAG和LEAD函数,ORDER BY 主键(主键不重复,且一般在MySQL中是顺序的数字)。
不能使用GROUP BY,会改变表格原顺序。
条件:LAG/LEAD结果=nums
【不能够使用 IS NOT NULLT进行判断(见下)】
3. 非连续问题:可以使用COUNT函数计算
- NULL和运算:
与、或、非、异或:(返回1/0表示T/F)- 0 AND NULL返回0;其他实数 AND NULL返回NULL;NULL AND NULL返回NULL
- 0NULL OR NULL返回NULL;其他实数 OR NULL返回1;NULL OR NULL返回NULL
- NOT NULL返回NULL
也就是说在判断条件中存在一个NULL,那么,另一个条件成立时AND返回NULL,OR返回True。如果条件查询实际为WHERE NULL时,相当于没有条件查询,返回所有。