00:00
好,呃,那这样我问大家,看到这种连续问题,第一时间直接想到等差数列的,给我扣一个一。直接想到用等差数列的。上来就准备用等差数列的。还有不少人对吧,那写出来了吗?用等差数列其实可以。其实可以。对,我知道讲过,但是这一题直接用等差数列它。它呢还差点意思对吧,所以呢,我们先写一个思路一啊,第一个思路就是大家所说的叫等差数列,等差数列啊,这个最早的时候还是我去给那个学生去讲的,然后后来加到课程里面了。
01:02
行,那这个思路我们来看一下啊呃,那首先要给这个数据排个序,然后呢,拿日期去减这个rank值。对吧,那不管怎么样,大家在写三个,有时候呢,你可能接下来怎么写,因为这个时候等差数列是不是能把绝对连续的求出来呀。对吧,能把绝对连续的求出来,但是呢,差点意思,但是你不用管,你只要碰到这种问题呢,你既然想到用等差数列,你先往后写,写着写着再去想。对吧,好,那怎么办呢?来看啊,首先等差数列这个怎么求。第一步。对吧,第一步思路一里边的第一步,也就是说1.1啊,假如说我们叫1.1好1.1我们应该做什么事啊。按照开窗对吧,开窗开窗呢,按照ID分组。
02:04
同时按照这个叫DT排序,求rank。当然,至于用run还是什么东西,你看一下这个数据有没有重复,如果有重复,你先做一个去重,对吧?因为我们要连续天数,假如说有两个,举个例子啊,有两个8月1号,你首先是不是要做一个去重啊,对吧?啊,这样一天只有一个啊,所以呢,我们求rank rank还是number就一样了,因为数据不重复,不重复三个排序函数是不是完全一样的,没问题吧,大家注意一下,如果有重复的,一定要先做去重啊,一天我只要一条数据就够了。啊好,那第一个第一题啊,就第一步我们先写一下select。啊,四个空格不要用table啊,不要用table对吧?好,那接下来呢,Select的ID得保留对吧,然后呢,DT得保留啊呃,那么接下来呢,是我们刚才说的rank,那就是rank括号,然后overval开窗对吧,Part。
03:16
第二问把提成BY,然后我们的ID啊,然后O的BY我们的DT,这个呢,我们叫RK磁带from TX这张表对吧?第一题就这样子的啊,第一第一小小步啊,然后我们把这个做一下。诶,我看一下这里面有哦,完了,这个有table键啊,所以你看啊,这中间有提示,看见没,对吧,我这个地方应该是按了一个table键,不是空格了。对,这个是table键啊,所以导致的这个问题啊,好这个就好了,对吧,刚才我们提示说要不要把这个剩下的966个都打印出来,因为table键在Linux里面是提示嘛,对吧,所以不能有这个table键啊。
04:04
那我想一下啊,我这个地方我这样吧,我把这个单单拎出来,单拎出来我用这个来做。用这个给他讲这个呢,更方便一点。我可以直接调成circle,还有颜色对吧,还有颜色我喜欢用这个啊,这个我一看就知道了,它是点点的话是空格,用sline对,用line啊,我以前经常用的是S啊,为什么现在用这个I plus呢?因为海哥说S是黑底的不好看,他说不好看。啊,他说不好看对吧。Rose between,不要不要啊,不需要这个outb就够了,对吧?好,可以改白底吗?啊,那到时候我研究一下啊,现在不管了,那我把这个结果拿过来。
05:00
我就拿这个来讲啊,这个大家能看得清楚一点,对吧?呃,那我们看啊这边。Rank就有了就有了,对吧?啊,那你看啊,12345678全是1001的,这个呢,12345678全是1002的区内排序嘛,对吧,用这个RA就好了,好不需要Rose between啊,不需要副总你一直用的这个。你一直加了这个Rose between的是吗?不需要的,这个不需要的好,那正常来说第二步我们应该做什么事啊,我们先写,先不着急想这个下面的思路,第二步是不是将每行日期。减去什么RK值对吧?啊,如果之前是连续的日期。对吧,则减相减之后。
06:00
为相同日期。对吧,主要是等差数列的思想啊,两个等差数列相减平行小点,如果等差数列的等差是一样的对吧?啊,那么剪出来的平行减的数据是一样的可以,这个就很简单了,假如说这边有个X队列,有一个Y队列啊,两个人的等差呢,都是Z,注意一定要等差相同的,你不能你是Z1,我是Z2,那不对了,对吧,两个人都是Z,好,那这边呢,X1X2X3对吧,这边Y1Y2Y3,那平行相减一定是一样的,因为第一个值是不是等于X1减Y1对吧,第二个值X2减Y2。好,X2减Y2等于多少呢?看啊,等于X1加Z减去一。加Z对吧,那其实它就等于X1减Y1。
07:02
是不是对吧啊,因为我们俩等差都是Z啊,等差都是Z,所以你X2减Y2就相当于是X1加Z减去Y1加Z。对吧,啊,因为Y2等于它啊,X2等于它,它俩相减就等于这个,所以最终呢,算出来等于X1减Y1,哎跟这个相等啊,其实那之前那个就用到这个思想,就用到这个思想,应该公式算出来,所以要求两个等差数列等差相同啊才可以对吧,一定要等差相同,如果等差不同就不行,比方说Z1Z2就不行了,对吧。刚才我说的那个数学公式是当前这种做法的理论基础啊,是理论基础对吧?嗯,那好,那我们就减一下啊,减一下呢,这个很简单啊,C select的ID,然后呢,这个DT我们得保留对吧,DD得保留,然后接下来呢,是我们的数据啊呃,那数据呢,得塔sub括号把我们当前的DT减去谁呀,RK对吧?好,那这个呢叫flag。
08:12
要不取个名字啊就好了,From我们的第一秒。T1表啊,这个呢,嗯,这个呢,我们叫T1对吧子查询的表,这个呢,我们可以叫T2,那我把这个呢也做一个测试啊,那怎么测试呢,很简单,到这边啊,往这一放,T前面加一个括号对吧?T前面加个括号,然后接下来我把这个拿回来。往这放好,那我们每一步做一步测一步啊,但实际上我可以把它写完再测试也没问题,但是大家习惯还是写一步测一步啊,要我自己写的话,我就把它写完,再再统一的最后做测试,然后再去调。
09:06
这边呢,等待它运行完成,我们把这个结果也粘过来,大家其实应该能想象到它的结果是什么样子,对吧?啊,那这样吧,我只拿10012 1012是一样的。没没开本地,没开本地,呃,为什么不开本地呢?因为这里面有一个bug要跟大家去说。有一个bug要给大家去说啊,你们去运行,到时候最后我给你的这个你肯定运行不起来啊,就是你要开本地,你看不到这个bug。这里边有一个bug的,还bug是有很多bug的,大家注意一下,我不知道你们遇到过几个,反正我遇到不少了。你们写说写的少,可能遇到bug比较少啊,就是解决不了的bug啊。你要什么都开本地,你要什么都开本地,你根本就你也遇到不少了。你真的是遇到bug,还是你孙子写错了呀?
10:04
啊,当然,我相信大家肯定遇到的是爸爸。我就只粘1001可以吧,1002我就不粘了,可以吧,啊1002这个数据呢,我暂时先不干了。好呃,那这个东西呢,我们看一下看啊,原本意义上它连续的啊,它真正连续的看123567。连续的,那这个值减出来是怎么样。是一样的,哎,只要你不连续了,那减的值就有差别了,对吧?啊就有差别了好。有同学知道什么?有同学知道这个bug是吗?你们之间遇到过什么?好,那接下来你看啊,我们怎么办呢。这个如果说我算。
11:04
日期函数和开窗函数一起使用的时候,并不是日期函数,是data Di data Di,只有data Di啊好,那我们看啊,呃,现在这个结果如果让我们算出来,严格连续。严格连续是不是没有问题啊?如果算出来严格连续是不是没有问题?对吧,那我只需要按照ID和这个共同分组求count的值,它是不是联连严格连续啊?对吧,但是现在呢。现在是什么情况?我们要断一天,还算连续。我们要断一天,还算连续。对吧,那也就是说我们要把这个数据放在一起。
12:05
算啊算七天对吧,呃,然后这个数据算一起算三天,十十一十二,那你观察断一天的这种数据,它减之后你会发现什么情况。主要观察flag这个字段。我对这个数据做了一次rank以后。你看flag它断一天。什么情况?大家发现没?是不是原本断一天的,我剪了一次rank之后。
13:04
发现怎么样啊,它变成了连续。那大家想,哎,既然我们又造出来一个连续,我们不是要把这个数据跟这个数据放在一起吗?对吧,那我们能不能。做这个事儿呢。能不能把他俩再来一次,之前的那个操作。求一个rank,然后呢。做处理吧,再用一遍,对了,哎,再来一次啊,其实通过这个时候我们就看出来了,但是不能直接rank,我们是不是对这个数据要做去重啊。我们是不是要对数据做去重?对不对。对吧,你不能直接求出可减吧,那就不对了,对吧,你要说去重再去减好,但是去重之后有问题了,那怎么办呢?关键是一驱虫啊,这个数据我只能保留一个,那按正常来说,我应该保留七,保留一,在我一减对吧,但是现在不行,因为在这个里边是最小值,这个里边最大值,你到底保留最小值最大值,那搞不清了。
14:15
对吧,很不爽,那怎么办呢?这样来看啊,我们就保留绝对的连续的天数对吧?好,那也就是说1.3先计算计算绝对。连续的天数。啊。对,去重算抗啊,先把绝对连续的天数算出来对吧?好,那我们写谁来给的。ID,然后呢,DT啊DT呢就不需要了,对吧,Flag保留就好了。Flag保留对吧,然后呢,这个地方是count心。康德新这个呢是绝对联系的,我们叫this可以吧,绝对联系的啊,看新好from哪个表啊,填花表对吧,然后注意group by好,分组条件要有group by什么ID和flag吧,按照这两个值进行分组,好那接下来呢,我们继续这是第三步,对吧,我把这个呢也做一个测试。
15:28
好往那一放,然后呢,我们运行一下。对吧,这个是不是我们之前做绝对连续用的思路啊,到这一步为止,我相信大家应该都没有问题,如果说七连三等等那种问题是不是这样解决的。对吧,大家之前做的什么七连三呀,呃,然后蚂蚁森林那个题呀,都是这样去做的吧,对吧,这个应该是算绝对连续的啊,到这一步为止,对吧,接下来我们就不一样了。
16:13
等待它的一个结果啊。哎,蒋总你一说你就不听课。呃,可以啊,你说的第二次对吧,我以为你说第一次。啊,如果说第二次的话可以。对吧。啊,第二次可以啊,就是你说清楚,你看下面人给你补充了就好了,我因为我这里面没有用到那个东西,我用了rank,我以为你说的这个地方有第三次rank可不可以啊,那当然可以,我因为说了这三个都可以对吧?好,那我们就拿过来这个结果啊,我只拿一的。
17:03
好完了一个,呃,那我们看啊。这个就是绝对连续的三天,前面123嘛,对吧,第二个是456,哎不是567啊,567断了一天567,第二个567,这个是十号,这个是12号对吧,他们不连续啊,你看这个数据呢,他俩就连续了啊,所以他们是七天对吧,七天好,那我们就把这个连续的给算出来啊,给算出来,那怎么算呢?第1.4了吧。这个是T3表的嘛,对吧,1.4啊,1.4啊,那然后呢,再。计算连续问题。啊,那这个时候呢,就汽车熟路了,谁来给的ID对吧?呃。ID求好之后flag要保留flag啊。嗯,然后接下来呢,这个this要保留啊,This本身要保留,然后接下来呢是rank。Over,好,发BY啊,这个就有提示了啊,可以用了,对吧,因为我们写过了ID,好,然后呢,All by。
18:10
注意这个就不是DT了,这个flag了,对吧,然后接下来呢,是我们的嗯,Flag,我们再取个名字,哎,这个不能叫flag,叫新的一个flag对吧,New flag啊,第二次的flag或者叫second flag都可以啊好,然后from我们的T3表。P3好行,那这个我就不测了啊,我就不测了,就是不运行了,因为运营比较麻烦,对吧,最后呢,我们统一运行,我们统一运行可以吧,呃,那结果呢,我稍微的自己写一写啊,大家应该能发现到这个结果是什么样子,然后呢,再多一个字段呗,多谁啊这个new flag。对吧,多一个这个new flag啊,比方说我这个就不写了吧,呃,New flag里边这应该是什么。一这个是二。对吧,这个是三,这个是四没问题吧,啊这个结果我就先不去运行了啊,先不运行了,因为这个结果比较好想象到了,对吧?好,那下来这个是第四表。
19:10
听着了。然后呢,接下来1.5啊第五步,第五步呢,那这边呢,是在计算连续问题,继续嘛,还没做完呢,对吧,然后呢,把这个减这个吧,好加来第一次的来减去。New。对吧,好了是那个的。ID,然后flag保留对吧,这些数据呢,保留,特别是对一定要保留啊呃,然后呢,做一个相减,其实这个flag呢,我就不要了吧,这个就没有用了啊,然后呢,做一个相减,相减的话我想想看啊,Data sub括号,然后呢用flag减去这个new flag。对吧,好,那这个呢,我们可以叫flag啊,只有一个标记了嘛,就不需要两个了,然后我们的T。
20:04
四表对吧,放我们的T4表好,那这个结果大家能不能想象出来他是什么样子。呃,那只有ID和这个。Flag对吧?好,那flag呢,来看一下这个应该是七月30吧。这个应该是七月30。啊,因为刚才解嘛,这个是八月。这个是七月31。零七看三幺这个呢,也是七月31。对吧,最后一列不要了啊啊,大概呢,它的结果就长这个样子对不对。没问题吧,是不是能跟上吗?我这两个没错的啊,只是自己写的对不对。
21:04
这个能跟上吧,比较简单啊,因为我们刚才单独的测过一次了,所以呢比较简单,那接下来我们要算这个总的天数,那怎么办呢。计算连续的天数,断一天也算啊,这个时候我们要计算。点了吧。啊,顺序不一样,这个无所谓了。顺序不一样,我就不改了啊,改比较麻烦。你你不能这样,你这就那那我把这个换一下行不行。对吧。你不能要求这样啊,你不能不能这样,这个就是。好,那接下来我们要求的是什么呢?
22:00
Duck。啥玩意我们要求,那接下来这一步我们想啊,我们要连续的天数,它是七天啊。有同学说直接go by,然后some,那这个只有六天啊,大可不必是吧?啊,那但是呢是七天,哎,我们要的是七天。最后了,计算每个用户连续登录的天数,对吧,啊天数,但是呢,断一天也算。断一点也算啊,那你直接放是不是不行啊,因为我要七天,那这里边儿可以怎么做。啊,要不我先把这个写一下那的。ID对吧,用户保留,然后呢,上。
23:03
加一。断几天加几,你这个话说的,那断几天加几,那怎么去搞断几天呢。那我怎么知道判了几天呢?对了啊,用some days。啊,加康新。减一。就对了,没问题啊,因为你想啊,只要断一天是不是就有两条两次数据啊,断两天也就是说中间如果有两次间隔的话,那就是三条数据吧,也就是说你有几行数据。代表着你有假如N行数据是不是N减一。断了N减一天了,没问题吧,啊就是这个啊,就是这个啊,这个呢才是最后的,假如说我们叫this啊,然后呢,From我们的。呃,我们的T,呃,这个呢,应该是T5表对吧?啊,放上我们的T5表。
24:04
第五好啊,注意这边呢,我把这个来给保留吧。Flag对吧,得保留着啊,然后呢,这边转。然后呢,ID和这个flag。对吧,啊是这样子的。咋啦,蒋总咋了啊啊,是有人说你细,所以你一问啊,我以为我我的circleq有问题呢啊,我以为我的circle有问题啊行,那我们把这个最终运行一下啊,当然还有最后一步,最后一步我不写了,可以吧,最后一步是不是按ID分组求最大的对。对不对,是不是求最大的,对啊,我就不写了啊,因为你这个就比较简单,或者是写一下吧啊嗯,这个也不差这一步了啊,计算最大连续天数啊,计算最大连续天数好,那就C加啊,嘴上说着不写,然后还是写了对吧。
25:05
那的ID好,然后麦。这个地方呢,叫this。好最后一步了,对吧,我也不用写那个东西了。然后呢,这个地方是from t6表啊,这个呢是T6,呃,然后go back ID可以吧,这是最后啊好,那接下来呢,我们把这个做一个测试,叫最终S,最终的S是长什么样子呢?来,我把T6拿过来。然后提六前面加括号,注英文的啊,提六前面加括号把拿过来。啊,把这个T6拿过来,然后T5前面加括号。再去拿T5表啊,T5表长这个样子对吧,T5表往那一放。好,接下来我去拿T4。呃,T4表在这。
26:01
好,那往这一放,接下来呢,我去拿T3。T3秒,哎,T3秒我就整个的之前测测试了T3秒对吧,如果有问题肯定从T4开始的,我们再去单独测,不着急啊,好,T3秒整个拿过来就行了,TR t1不用拿了,因为已经做过了,好那这个so呢,就长这个样子对吧,我们来运行一下啊。诶,我看一下,呃,果然这个里边啊,这个里边这个里边他直接说我们剪这个不行,我就知道有有一个这个问题啊,就是哪一步呢,这一步啊这步。这一步对吧,要做一个减一啊,要做一个减一的问题,那这样我们先不减了可以吧,先不减了,大家知道最后呢,我们做一个减一就好了,对吧,这个减一我就不减了,他不让我们直接这样去减啊,你最后呢去减一就行了。就是刚才那个减一的问题啊,对吧,他不让我们直接那样减,但是我们知道你sum之后加count要减一吧,啊,那我们最后去减也可以嘛,对这个结果算出来我去减一完全没有问题,对吧?能理解这个事吗?
27:13
刚才报错就是那个一,就是那个一的问题。那我这个减一,我什么时候减,是不是都可以啊。我到了最后就写行不行啊,可以吧啊,这个要注意一下啊。我得把空调关了,有点冷。你们在家里冷吗?我怎么感觉老冷了?我吹着电风扇,开着空调。为啥报错?嗯,他不让你那样操作一个聚合函数。对吧,一个聚合函数,然后后面去减啊,我看一下他报的错啊。
28:04
SE一致性的一个问题,嗯,一,No match method for啊,就是这个。就是它报错的原因呢,就在于你前面都是去函数,你这不分组了嘛,对吧,你最后这个一一没有分组。我是开着空调吹电风扇,所以感觉冷。什么玩意儿?海狗人参丸,我需要那东西吗?真的是。好,来看啊,这个结果呢,是没问题吧。你稍等,不要着急嘛,你怎么会抢答了呢?啊,对吧,当时我减一。减一是不是就是七九啊。对吧,是不是就七九了。一带上单引号行不行?
29:00
不是单引号,单引号的问题是前面做了聚合,你不知道聚合。没做聚合,而且这种方式我们也不用,就像那个张总说的。把我的路先走了,对,你跑到我前面去了,那这多没意思,对不对,那这种情况为什么我不用了,那你想现在是断一天算连续,假如说我让你断两天算连续,你是不是又得嵌套一层三天呢?是不是又得加一层无限套娃。假如说我以后。公司面试的时候让你写一个段,五天还算连续,你是不是要套六层?你是不是要套六层啊,对吗?那这不很有问题吗?是不是对吧,但是这是第一种思路,它也是一种思路,对吧,它也是一种思路啊好,那我把这个也保存一下。呃,我保存到咱们的一个桌面啊,或者是这样吧,我把这个这个是我虽然在这里面写的,但是呢,我给大家摘过来。
30:04
对吧,思路1CTRLC啊,我给它放到这个里边可以吧,大家呢,到时候就是我还是统一的同步这一个文件啊,我保存就行了,对吧,这是第一种思路,我们搞定了。
我来说两句