SQL 是作为开发工程师、数据工程师必须要深入掌握的一项技能。我也一直在提升这部分的能力,从入门到精通。除了阅读一些 SQL 经典书籍,刷题也是一个不错的选择。于是,我将做过的题目与解法,汇总到这里,和大家一起学习。
SQL 练习题系列和「体验碎片」系列一样,会不定期进行更新。
问题:编写一个 SQL 查询,查找连续出现 3 次的数字
结果:连续出现三次的数字为 1
解法1:使用偏移函数
1.使用偏移函数取出每个数值前一行和后一行的数据;2.错位后的三个数值应该相等;3.要对数值去重,如果某数字连续出现3次,之后又连续出现3次,会num多次输出相同的数字,而我们只需要一次而已。
select distinct num as ConsecutiveNumsfrom (select num, lead(num,1)over() as num1 , lag(num,1)over() as num2from Logs as L) awhere num = num1 and num = num2;
解法2:使用窗口函数 row_number
核心思路:如果是连续的记录,那么 (row_number() over(order by id)-row_number() over(partition by Num order by id))as rn 相同。
SELECT distinct(Num) as ConsecutiveNums from(SELECT Num, (row_number() over(order by id)-row_number() over(partition by Num order by id))as rnfrom Logs) tgroup by Num,rnhaving count(1) >=3;