00:00
好了同学们,那那接下来呢,我们看一下这个第三题啊,呃,那么第三题呢,看一下它是一个间隔连续的问题啊,我们前面求到的第一题啊,连续问题有一点差别,我们来看一下,呃,题目给我们的数据呢是这样。他说某游戏公司记录的用户每日登录数据,也就是说这个人在12号登录了,诶同样的另外的人12号也可以登录吗?这是可以的,呃,13号这个人又登录了,14号,诶16号15号,也就是说怎么样他并没有登录对吧?好,那我们再看101这个人,诶中间十七十八都没有登录,诶19号登录了,呃,之后呢,在我们这个20号又登录了,就类似于这样的数据,呃,他要求我们求什么呢?计算每个用户最大的连续登录天数,那如果题目只看到这,这就很简单了,我们就可以搞一个等差数列,呃最后呢,把那个等差数列值count求出来以后,求一个最大值就好了,对吧?它要最大的连续天数啊,但是呢,这边加了一个条件,说可以间隔一天,什么意思呢,还给我们了一个解释,如果说一个用户啊,在一号三号五号六号,诶中间呢,二号四号间隔了一天没有登录,对吧?好,那这种情况下呢,我们视为连续六天。
01:18
上路。啊,那也就是说这个就比较麻烦了啊,你比方说我把这个数据拿过来啊,呃,当然了,同理,我在这边呢,Select我给大家看一下数据呢,我已经导入了啊,还是我们这个数据完全一样的,没有什么区别啊呃,那这个呢,我还是在这边给大家写一下啊,这个首先是一个ID对不对,然后呢,是一个DT字段,好,那把这个拿过来啊呃,然后呢,我把这个数据呢,我先给它做一个区分啊,也就是说我把102的给它放在一起,101的放在一起,因为他有一个人的连续登录嘛,所以你肯定要把这个数据呢分开去看。对吧?好,呃,那我这样的话就把这个101102分开了,但是正常日志当中它肯定是岔开的,这个无所谓,我们只要写一个group by,或者说开窗当中写一个part,那它这个数据就能到一起了,这个倒不是什么,呃,难点的地方对吧?好,那我们来看一下这个当中啊,它的最大天数,我们先肉眼观察一下这个数据啊,呃,那么从这个角度来看,它是12 13 14,这严隔连续肯定没问题,然后15号没有,16号有,中间间隔一天可以啊,那么这四个,呃,然后中间十七十八少了间隔两天不行,对吧,不满足条件,条件呢,只说了间隔一天是满足的,那十九二十可以,那也就是说它呢,中间有一个15号没有登录,那其实我们可以视为连续五天吧,那这个呢,连续两天最大的101最大的连续登录哦。
02:49
五天,呃,那对于我们这个数据而言呢,诶这个数据呢,应该是这样,先有一个12对吧,我这个数据刚才拿下来的时候应该是没有转啊,像12中间有十三十四十五没有登录,十六十七登陆了,也就是说他一天两天,也就是最终我们要的结果是1001几天五天对吧?1002几天两天,这是最终的结果啊,这是我们正常分析出来的一个结果数据,那这个呢,到问题都不是很大啊,呃,关键点在于这个东西怎么求呢?我如果说弄一个等差数列能行吗?
03:25
好,那我们观察一下啊,在这后面如果说能等差数列,就在这后面加一个RA值,好难一相减啊,呃,这个是11,不错,这个11啊,这个呢也是11,好,这个是12,那么这个呢是14,好,这个是。14啊,因为像这个减出来相同的数据,他们之间前面是不是严格连续啊,对吧?嗯,满足条件没问题,但是接下来呃,那这个16应该也要合并进去。但是现在呢,你合在一个组里边呢。不行了。对吧,好,但是大家有没有观察到一个点。
04:03
就是如果说中间是间隔一天的话。你好像减第一次等差数列以后怎么样,它们就变成了一个。等差熟列了,看见没?十二十一对吧?好,那其实在这种基础上呢,也能做,你比方说啊,呃,但是这种思路呢,我给这只是给大家去说一下啊思路一啊,思路一呢,还是用等差数列的方式,还是要用到等差数列的方式,呃,那么第一步呢,我现在后面补一下这个数据,给大家去说一下这个思路啊,扩展一下思路对吧,但是这种方式呢,呃,不太方便,因为未来如果说间隔一天,间隔两天,间隔三天,这种就不太好了,好,那我们继续写,那这个数据减出来呢,应该是多少,大家想一下应该是幺幺对不对?好,那第二条数据剪出来呢,同样的也是幺幺啊,因为他们之间呢是严格。
05:01
严格的连续嘛,才三条好,它呢幺二了对吧?啊,剪出来幺二好,这个是幺四好,那接下来呢,这个是要死啊,但现在我们看到的是这样的数据啊,只要它相同的,这个相同的说明这两条数据呢,严格连续那肯定是我们的目标数据没问题啊,但是还有一类,你看这个16跟这个14间隔一天,这个是我们的目标数据啊,那我们怎么找到这个目标数据呢?首先第一步啊,呃,等差数列之后,我们先把这个严格连续的天数给它求出来,也就是说在这个基础上,我们可以求到1001,在这个时间点对吧,它呢三条吧,有三条数据啊,那同理在这个1001。在这个数据下只有一条啊,还有一个。这个时间1001,在这个时间呢,也只有一条,也只有一条,好呃,那通过观察这个数据有一个什么特点呢?就是我们的目标数据,呃,就之前间隔一天的这种数据,间隔一天的这种数据,在第一次做软之之后,怎么样到这儿来,他变成了一个。
06:13
严格连续啊,所以呢,第二步我们可以对这个数据再进行一次,什么求rank值,你比方说啊,呃,这边呢来个一,这边呢来个二,这边呢来个三,好同理,呃,那此时呢,这个数据变成这个样子啊啊一减这个应该是多少?是不是十号了,对不对。啊,这个地方呢,就变成十号了,那它呢也是十号啊,而这条数据呢。啊,11号啊11号好,那也就是说之前间隔一天的做两次专之后,变成了一个什么绝对连续啊,变成了一个绝对连续,好,那在这种情况下来说呢,我们就可以求得这中间的一个值了啊怎么做呢?那我们最大连续天数不是五天吗?那现在呢,你累加起来加上这个值的count值减一,因为呃,那为什么要减一呢?因为两条数据中间有一个断层,那我们加上这个count值其实是补中间断层。
07:15
对不对,你比方说他严格连续的是12~14,这是三天,然后这是一天,中间是不是还断了一天。中间还断了一天,对不对啊,所以呢,我们要把这一天补上去啊,那你看啊,第二次做rank值的时候,它的count是几,就说明当前这次中间有几个断层。对吧?啊,应该是count是几,应该是count减一个断层,所以最后呢,我们只需要把sum这个值加上count,它减一就好了,就得到这个值了,好,这是第一种思路啊,但是这种思路不建议大家未来去写,为什么呢?那这是我们求的两天,也就是说间隔一天算连续,假如说现在公司变了,呃,我要间隔两天,间隔三天,间隔四天也要求,那如果说你还用等差数列的话,这个时候就疯了,就套娃。
08:06
就套无限层对不对啊,所以呢,这种思路供大家去呃思考一下,因为第一题呢,咱们用的是等差数列嘛,所以有时候大家思维定式的影响,哎,一看到这种连续问题,可能想到的都是这种等差数列的问题。啊,等差数列的问题对吧,所以呢,其实他如果站在等差数列的角度来说是可以完成的,没有问题,但是呢,呃,这种方式不好不优,对不对,好,那这个呢,是思路一,仅供大家扩展思路用的。
我来说两句