一、题目相关内容
1)相关的表和题目
2)帮助理解题目的示例,提供返回结果的格式
二、自己初步的理解
其实这一部分的题目很简单,但是没啥思路啊,怎么想都想不通,还是看题解吧,中等题就是中等题。
三、题解展示和分析
评论区高手多啊,理解后觉得这个题目还是需要细细思考的,所以整理一下。
1.通过自连接的简单解法(也是官方解法)
其实我还是不怎么理解这一题的意义,有可能是因为是id和num这种没太多意义的字段,所以要动脑子了。然后猴子数据分析的解析有一个联系生活实例的,好懂一些。原题目是找出连续出现至少3次的数字,而这个数字以id命名。实际生活例子就是连续出现至少3次的成绩,成绩以学号区分,有兴趣的可以去看看。打算分解题目并联合题解思考,下面是题解
SELECT * FROM Logs l1, Logs l2, Logs l3 WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1 AND l1.Num = l2.Num AND l2.Num = l3.Num ;
连续:利用三张表的id固定的差值1表示是连续出现的数字
相等的num:各个表的num相等就行。
输出相等的num:三张表num相等,随意输出一个就行。
但是重点是我不知道怎么就想到自连接的啊。
这里隐含的前提是复制多个表,自连接。我脑子里想象的是每个表横着连在一起,最终输出一条记录。其实这三个点我都没想到自连接以及连续由id把控,num相等也是放在where。多多努力吧,下次说不定就记得了。
然后有一个注意点,我自己提交的题解就是第一个,但是我没有想到distinct这个,然后提交的时候报错了,果然不自己打我都不知道,因为有可能连续三次之后第四次还是连续的,那就有两个相同的num了。
2.符合实际的题解
因为看评论区有提问如果不是连续3次,更多难道都得连接起来吗,而且id正常情况有可能不连续的。下面就是解决这个问题的题解。
SELECT DISTINCT Num FROM ( SELECT Num,COUNT(1) as SerialCount FROM (SELECT Id,Num, row_number() over(order by id) - ROW_NUMBER() over(partition by Num order by Id) as SerialNumberSubGroup FROM ContinueNumber) as Sub GROUP BY Num,SerialNumberSubGroup HAVING COUNT(1) >= 3) as Result;
但是我还是觉得我理解的不透,以后补上吧,评论区也有一个很牛的总结这个题解的人!!
四、总结
就是想不到,也就是不熟练,多多练!!!
我还是觉得自己想的多,然后让自己停下步伐了,想要整理中等题我为什么不会的原因,但是这里题都还没开始动就想,走都不会就想着跑了,但是我又知道反思很重要,又感觉自己不得其法,我是不是要复习之前做了什么啊!!!!!然后明天有一个面试,然后想着能准备一下,然后找各种东西,又发现自己好多东西不会但是发现自己还是别准备了,还是让自己相信快就是慢吧,但是做完这一题总结我感觉其实自己还是不会啊,就是到底怎么总结吗,只写自己做了什么感觉得不到成长啊。写完这题找下思路吧!!!
然后最近确实静不下心,应该是方法有些不对。