00:00
咱们先来看看啊,我们这个目前这个写法还有什么这个不好的地方啊,刚才我们已经做了一个简单的一个小优化了,对不对啊,但即便做了优化,你还会,你还你还能发现啊,咱们现在是不是有三个子查询,那三个子查询呢,我是不是需要读这个表三次,是不是读三次。啊,那我这个表也不小,是一个大表对吧,那我需要读三次,那显然也不太好。那我有什么办法啊,就是能够减少这个读这张表的这个数据的次数呢。啊,我能不能就是只读一次啊,就只便利这张表一次,把这个结果查出来。啊,能不能这样。只便利表示一次就把结果得到。啊。能不能?其实大家也能也能大致看一下啊,你看啊,我们现在。这仨子查询这个结构看是不是好像啊对吧,对不对,都是从这张一张表里查数据对不对啊,然后呢,就是外过管外过滤条件可能不太一样啊,对不对。
01:10
啊对,有可以用什么所谓的sum if对吧?啊,但是这个具体怎么写,这好像跟之前那种还不太一样。啊。这个怎么搞?啊,他们仨其实还是有区别的啊,这个怎么搞?嗯,也不光是这个过滤条件不一样,对吧,除了过滤条件不一样,还有什么不一样啊,这日期什么的时候也不一样啊,对吧?啊这好像还还还不能直接用三一啊,这个怎么搞一下。啊,怎么搞一下这个东西。这咱们能不能想明白啊,我看看。
02:06
嗯。怎么着,能不能想明白?想明白想明白呢,那现在我先给大家写一下啊,我先把这个思路给大家写一下,写完之后呢,我们再解释啊,在这呢,我们可以这样去做。可以select一下啊,Select from什么呢?就from这张表。From咱们这个DWT层的UV topic对不对,那这次呢,我们过滤呢。我们现在不是分开写了,我们一起算,那一起算的话,那咱们是不是也得把这个login it first。哎,用这个条件去过滤一下,只不过这次过滤呢,我们要过滤几天的呀,我们过滤这三天的,我们把这三天的一次性的过滤出来啊,那where是不是应该来一个login data,哎,First对吧,应该是in吧,因为你是过去三天是不是得in,那in的话后边我可以先写死啊,比如说2020杠零六杠幺几。
03:04
幺四啊逗号,那再来一个2020杠零六杠幺五,那逗号2020杠零六杠幺几116啊,那跟上面是不是一样啊,161514没错吧,好,那相当于我把这三天的数据是不是都过滤出来了,对不对,那完事之后呢。羊肉怎么做?完事之后呢,我是不是需要拿到三天的这个新增三天的留存,对不对,那所以说你这个数据得怎么做,是不是得分开算呀,我十六十四号的一起算,15号的一起算,16号的一起算,对不对。对不对,那既然要分开算,那你说你得怎么办?分开算是不是得对它进行一个分组啊,对不对,那所以咱们这呢,GU如拜一下group,谁就GU如拜log in date first lo date。
04:04
呃,DA date first是不是就按它分组啊,就按它分组,那按他分组之后,我们相当于会把什么样的数据分到一组啊,会把14号的数据分到一组,15号的数据分到一组,16号的数据分到一组,对不对?当然这个14指的是14号新增的啊,十号新增的放一起,15号新增放一起,16号新增的是不是也放一起啊?是不是这个思路弄完之后呢,你就可以分开去算了啊,那首先我们先选第一个字段啊,第一个字段就是一个统计日期,这个是无所谓,我们直接还是写死啊,就写还是写17号就行啊CT啊好,那接下来关键是下一段,下一段是谁,是不是那个credit呀,Credit就是啥,是不是就是新增日期,新增日期咱们这写谁就行。是不是就写log in data first可不可以,可以吧,因为你现在你分组是不是按他分的,按他分的,那能不能选的可以选没错吧,好,这是关于他这个新增日期,那接下来我们看这个留存留存怎么搞。
05:05
留存天数,每组的留存天数应该是不一样的吧,对不对,我14号的新增,我算的是它的三日留存,15号呢,我算的是两日,16号我算的是一日,对不对?那这个怎么写在这儿。哎,你72可以总结一个规律啊,你看一下一怎么来的,一是不是用17减的它对不对?二怎么来的,二是不是用17减的它,那三怎么来的,是不是也是17减的它对不对?那所以在这呢,咱们可以直接用谁,是不是用一个日期相减的函数就行了呀,当然咱们这用date date a date up行吗?不行,Date at date up是不是用日期和一个int值进行加减,我们现在是什么?是两个日期进行加减吧啊,那日期进行加减应该怎么做,当然是减啊,日期相减怎么做,用谁用代塔立F函数。哎,Dif这个函数,这个函数呢,我们去使用怎么使用啊,我们需要给它传两个参,那它会将第一个参数减去第二参数,然后返回一个int值,就是相差的天数加天数啊,那咱们这应该用谁减谁,是不是应该用这个东西减去下边这个东西。
06:16
减去谁减去log data first对不对?哎,那我这个语法能能成立吗。语法成立吗?咱们这儿是不是有隔入Y啊,咱们说了格入Y之后呢啊,我要么选常量值,常量值可以选,要么选你分组的字段,要么选具有函数对不对,那这个东西这是个聚合函数吗?首先。这是U函数吗?这不是具函数对不对,那理论上这个是不是应该是不能选的呀,但是其实你可以发现一下啊,这个函数里边咱不是传参了,你传参是什么?第一个参是常量值,第二个参是你分组的字段。对不对,那所以说因为这是一个相当于它是一个什么函数,是一个一进一出的函数吧,一进一出没错吧,啊,这if你给进进来一行,是不是返回一行啊对不对,然后你进来了呢?诶是我的常量值,或者是我分组的字段,那所以说我这个结果它也相当于是哎,一对一的啊,这个是没问题的,这是可以选的啊OK,那也是咱们再总结一下啊,也就是说你分组之后,你还能传什么样的参数啊,你能传这种一进一出的函数,但是要求你一进一出的函数的参数必须得是啥,必须得是你分组的字段或者是常量值,这个是没问题的,可以传啊好,那这个也没问题,那相当于我们是不是就搞定了这个值了呀,这个字段了,那接下来该谁呢?该那个,呃,新增还是留存呀。
07:35
该。该留存了对不对,留存数量,那留存数量咱这怎么整。啊,留存数量怎么整。是不是跟上面一样的切法?就拿过来就行。只要你的末次登录日期是17号,那我就记一否就记零,你得到的是不是就是留存数量,只不过呢,你这是怎么算的了呀,你是分组算的了,对不对,你这是每组的留存数量,是不是都单独求出来了,没错吧啊,那接下来最后还剩一个啥,还剩一个新增,那新增怎么写,新增是不是也是这么写呀,是不是也是抗星C啊,看型。
08:17
诶是不是搞定,那搞定之后呢,最终再怎么写,在他俩是不是再比一下就行,是不是跟这也是一样的写法,CTRLC我们放在这个位置。诶,那这样一来我们就完成了这个circle了,也就实际上你上边这一大堆东西啊,用下边这一个circle是不是写出来就是一样的了呀,对不对,你看我们来CTRL这个enter,你运行一下。这个结果当然目前看这个结果它是这个不太一样的啊,不太为什么不太一样啊,这个当然你因为你上面你是union对不对,Union是不是无论有没有数据,是不是都是三条对不对,但是咱们下边这个呢,是因为我这个login date first是不是只有一个十十四啊对吧,我没有其他的,我没有什么16,没有15,所以说你这儿是不是分完组之后只有这一条啊,这因为没数据导致的,如果有数据有数结果肯定是一样的啊,有数结果呢是一样的啊,那这三这这个写法跟上面的写法是一样的,结果是一样的啊好了,那这块就大家注意一下就行,这样呢,我们可以优化一下啊,就是把这种方式写成这种,那这个数据呢,咱们就不用遍历三遍了啊好,那这个我们相当于就完成了啊,来,我把视频录一下。
我来说两句