00:15
嗯,好各位,那现在呢,我们来看一看这张表,它的数据装载我们要做的话,可以怎么做来分析分析数据装载怎么做。呃,假定咱们当前的日期呢,还是2020年的六月14,对不对,那我现在得算一个什么呢?我今天的时候是不是得算一个历史到6月14号的一个汇总结果呀,对不对?好,那想想这个怎么汇总,还是老老规矩,先明确从哪张表里取数来吧,啊,咱们这儿可以从哪取数。啊,其实哎,还是两种啊,两种两种这个思路啊,什么思路呢?首先第一个,如果在DWS层有一个跟咱这张表相对应的ED的表,什么叫相对应的,也就是说我的业务过程跟它是一样的,那我的这个力度跟它也是一样的,对吧?唯一不同的是什么呢?那就是OK,那这个呢是TD,那个是ED,对吧?如果有一个这样的ED的表,我们就可以从哪取出,可以从ED里边取。
01:10
对吧,你把历史上每一天的汇总结果加一起,得到的是不是就是历史知音啊,对吧?OK,那这是一种思路,当然如果没有的话呢,那我可能就得从明细表里取分了,对吧?那由于我们目前这个出仓啊,呃,就是咱们DWS,咱们还没有设计其他的回总表对吧?所以咱们目前其实是没有这个ED表了,那所以说我们现在能想到的就是从明细表里取,对吧,那咱现在呢,就从明细表里边取一下税啊,那当然呢,由于咱们是历史至今,所以说我们从明细表取数,咱是不是也得拿全部数据对吧?所以说我们首先得先来一个c from dwd层的T交易,然后呢,后边来一个啥order detailc对吧?那完之后呢,我们需不需要过滤分局,不需要全苗嘛,对吧,之后咱们需要干啥?全面数据拿到了之后呢。得做一个什么操作。得做一个什么走动。
02:00
分组吧,啊,这个不需要开窗啊,OK,呃,就是大家这个现在对开窗跟分组能不能分清他们俩的这个区别,应该能吧,就是呃,最直接最明显的一点区别是什么啊,就是你分组是会改变我们这个数据的力度的。对不对?你比如说我按照某一个字段分组,那我这个结果的力度跟你原表是不是就不一样了,对不对,OK,但是开窗会改变这个呃,原有数据的力度吗?不会,开窗只会在你原有的数据的基础上加一个什么呀,加一列而已,对不对?它不会改变力度,这是开窗跟分组它俩最最最主要一个区别,这点大也把我搞混了啊好,那接来咱继续完就行,那这儿我们要做的肯定是分组,对吧?我们得把这个明细数据是不是聚合到用户力度啊,对吧?那直接葛入外UID就完事了,那上面我选一个ID出来,那接下来再往下等,下边这是不是还得来一个什么older date first older it last,对吧?这个东西怎么求啊?是不是就是最大值最小值就完事了,对不对,OK,那在这呢,比如说我想求一个最小的下列日期,那我直接来一个啥就行,我直接来一个min就行,对吧?Min完之后呢,我们把谁放进来,是不是得把这个表里面的那个所谓的下单日期放进来,对吧?那下单日期咱们应该放谁放data台ID对吧?诶我放这个DT行不行。
03:17
DT注意DT是咱这个表的分区字段对吧?哎,放DT行不行。其实前面讲过,DT正常也能当做一个普通的字段去查询,对吧?我查DT算也能查出来值,那它跟它我能不能混着用,其实可以的,它俩的值永远都是一样的,为什么啊,来咱们分析分析啊,这是一张明细表对吧?明细表我们是一个这个INC增量分区的一个规划,对吧?增量分区我们是怎么规划来着,是一天一个分区吧,一天一个分区,然后每天的分区放什么?是不是放当天的下单明细啊,对不对?OK,那你想一想当天的下单明细,OK,那我的下单日期是不是就是当天的日期。对不对,那我DT是不是也是当才的日期,那所以说d data ID和这个DT它俩值都是一样的啊,是这样的,所以说在这呢,你用DT,你用data塔ID其实都可以啊,OK啊,在这呢,我们就呃直接一点吧,咱们用data ID啊OK,那我把这个data ID给它放下来DA啊,然后呢,下游下ID放进来,那这样一来就能拿到咱这个所谓的首次下载日期,好,那有同学可能会有疑问啊,你这个字段这不是个字符串吗?字符串我能用这个最小值去求吗?能不能?
04:24
能字符串是不是也有大小这个比较的规则呀,对吧,它是按照什么,是按照字典顺序排对吧?那你想一想,我们这个就是日期年月日对不对,我是不是正好就可以按照这个字典顺序去排啊对不对,你比较两个日期的大小,你就得怎么比,我是不是正常就得先比较年,比完年之后再比月,比完月之后再比日啊对不对,那所以按照最点顺序排没有任何问题啊,所以在这儿呢,你就直接诶用一个最小值求一下这个日期就完事了,接下来继续往下,下边呢,我们再求一个末似的,末次直接来一个date ID是不是就能拿到末似下载日期最大值就完事了,现在继续往下走,下边呢,就是什么欧count,欧count其实就是什么呀,就是一共下了多少次单,对不对,OK,那这边呢,咱们应该怎么去求呢。
05:05
也是直接看的对吧?哎,那理论上按照同学的理解,我直接看看心就行了,但这回呢,我们得稍微的注意一下了啊,为什么呢?因为这个咱也叫下单次数对吧?我上面是不是也算过下单次数,但是你要注意,咱们这个下单次数跟上面那个下单次数咱们的统计对象是不一样的,咱现在算的是什么?是人的下单次数对不对?而我们前面算的呢,是商品的被下单次数对吧?那这个通常我们这儿是有一点区别的,通常怎么区别呢?呃,人下单的次数对吧?人一次下单,我实际上对应的是一个什么?是一个older对不对?没问题吧,所以说我在算人的下单次数的时候呢,我不管这个older下边有多少个明细,我都算一次。能理解吧,也就是一个O就算一次,OK,那咱这张表当中,我每行数据是一个明细吧。能理解吧,那所以说我正常情况下,我要想算人的下来次数就怎么算,我能直接count他型吗?不行,因为有可能多个明细是不是属于一个订单呀,对吧?那一个订单对人来说是不是就是一次,所以我们应该是count一下的older ID是不才行啊对吧?诶,但是对于商品的而言呢,呃,其实明细表当中一行是不是就表明这个人他下单了一个SK啊对吧,你算商品的话,你一行可以表示一次啊,这个一要稍微的注意一下啊,所以在这呢,我们还得把它稍微的调整一下,我们来一个count第一次TNKT对吧,里边呢,我给它放上一个older下下ID好了,那这样一来,那这个下单的次数诶咱们就统计出来了,接下来继续往下走,那再往下这还有一个什么呢。
06:35
行哪分,你这算的是历史截止哪一天的这个,呃,这个数据对不对,是不是就得放到哪一天的分区啊,对吧,那咱们这算的是历史截止哪一天呢?是14号的都在样的,就给它放到14号分区,那就完事了,零六杠幺四诶那就完事了,OK,那这就是咱这样的数据状态是不是看起来非常的简单啊对吧?简单确实是简单,但是这个计算效率它能高得了不?肯定不高对吧,他拿的是全点的数据对不对,OK啊OK好,那么之后现在我们就来思考一个问题了,你说我们到了第二天,这是咱们第一天14号,咱们必须得这么算对吧,你说我们到了第二天的时候,诶,我还这么算吗?
07:13
还这么算吗?那怎么算?咱们来分析分析啊,视频我先停一下。呃,好了,各位同学,那咱们接下来呢,就继续往下分析啊,这节课时间不多了啊,我们稍微分析一下,然后大家就可以下岗休息一会儿啊来咱们现在分析分析,你说我到了第二天的时候,你第二天是不是就是15号,对吧?15号理论上我们应该算一个什么,算一个历史截至15号的这个汇总结果吧,对不对?OK,那你要想算历史截至,呃,15号的汇总进库,你说你可以怎么算,诶我还这么算行不行,先说能不能得到准确的结果,比如说我到了15,我就还把这个再执行一遍,然后这个呢,我给它放到15号上去,这个有没有问题,没问题,虽然这个查询语就是没变啊,但是大家都知道你到了15号这张表下边它的数据会变吧,这个表他说是正常,是不是会多一个12的分去,对不对,那你再拿群表,你拿到的不就是历史截至15嘛,直接汇总,然后就是历史截至15号的汇总结果之后呢,放到12分区,这个没问题,结果是对的,但是这里边有什么问题呢?问题非常明显,这里边肯定会存在什么。
08:11
重复计算嘛,对不对,啥意思?你想啊,你在14号的时候,你会算一个历史截至14号的这个这个这个明细数据你得汇总一下,对吧,那你到了15号的时候呢,你是不是相当于又把历史截至14号的那部分数据算了一遍呀,对不对,所以显然是有重复计算,而且每天都会有重复计算,你每天都会把前一天的那个数算一下啊,对吧,这个显然是不太合适的,OK,那那现在可以想一下,我们这儿可以怎样优化一下这个计算。哎,咱们优化一下。啊,其实咱们大体的思路我听同学已经说出来了啊,大体的思路应该是这样的,就是说我再去从我从第二天开始的时候啊,我不再让他从头去进行历史聚合了,对不对?那我怎么做呢?哎,我基于前一天的那个计算结果对不对,然后呢,哎,再进行计算对吧?相当于利用一下前一天的计算结果对不对,大体的路应该是这样的啊,我是不是得先拿到历史截至前一天的汇总结果对吧?历史截至前一天的汇总结果在哪拿呀?
09:12
是不是应该是在这张表的前一个分区里的,对他前一个分区是不是就是历史截止前一天呀,对吧?好,那先从这张表的前一个分区把它的数据查出来,这就是历史截止前一天,那之后呢再怎么办?再算一个今天的这个结果是不是就完事了,对不对?今天的结果从哪来,是不是可以从今天的明细,或者说今天的异地表里边去拿呀,对吧?好,拿到一个分区,然后呢,给它放在这儿之后,他俩是不是进行一个相当于是一个累加的操作就行了,对吧?历史截至14,再加上我们15的一天的得到的不就是历史截至15嘛,对吧?那这样一来,其实可以利用前面的计算结果,能够减少重复计算,好那现在问题来了,这个S咋写?啊,对不对,这个算课怎么学啊,可能这节课没时间了啊,然后大家呢,可以利用课下时间好好想一想,看看能不能想出来啊,这个大家琢磨琢磨啊,来,我把视频停。
10:03
那好了各位啊,那下面呢,我们就来把刚刚我们提到的就是这个历史资金汇总表的这个,呃,就是相当于从第二天开始之后的这个数据装载的思路,咱们去实现一下,呃,那其实呢,我们这张表咱在做第一天的装载的时候,没有其他的办法,对吧,我们只能是从。明细表,或者说从这个异D表里,对吧,去汇总一下这个全部的历史数据,因为第一天这个没有前一天的结果可以利用嘛,对吧,这没办法,那所以在这儿呢,咱们相当于会给它区分一个首日和每日对吧?那在这儿呢,我们来一个首日,首日人只能是这么做啊,然后后边呢,咱再来一个每日来刚刚,然后呢,来一个呃,每日,好,那这个方案呢,肯定就不能再用了,对吧,直接删除,好那现在我们来看一看怎样能跟前一天的结果进行累加啊,其实个刚才同学就提到了,跟那个拉链表有点像对吧?那现在咱们分析题可以怎么做啊,实际上咱可以这样去做,首先呢。我先去从这张表它的前一天的分区里,对不对,拿到我们这个全部的数据对不对,那在这儿呢,你应该能得到一个这样的一个结果集,对吧?好,那完了之后呢,我再怎么样,我再从比如说DWD层,或者说是从DWS层的1D表里边去拿一下,对吧?我们今天的下单季度的一个汇总结果,对不对,OK,那完了之后呢,他俩是不是得放在就是放在一起啊,对吧?OK,那这两部分数据,那他们的包含关系应该是什么样的呢?其实也应该是互不包含对吧?有公有的部分,也有各自独有的部分,对不对?好,公有的部分它意味着是什么呢?意味着就是。
11:37
原来下过单的用户,今天他又下单了,对不对,那之后这部分指的就是原来下过单的今天没下单,这是今天的,相当于是今天的新增下单用户,对吧?那完了之后呢,我们要做的工作是不是就是呃,把这个左边跟右边这个给它加一下啊,对吧?那他俩怎样才能加呢?你是不是得join到一起才能加呀,没有对吧,得做一个join啊好,那join的话,我们采用哪种join方式呢?我们应该采用。
12:01
全外联嘛,肯定要用全外联,你要是采用别的热方式,可能会丢失一部分的这个用户啊,对吧?所以只能采用全外联,好,那现在这个方案基本上定下来了啊,那接下来我们就把这个实现一下,首先我们先写一个查询select,然后呢,From哪张表呢?DWS,这应该是找到这个交易域的,找到用户力度的,然后是order历史资金汇总表,之后呢,我们需要拿的是它前一天的分权啊,那V尔DT得等于是不是当天日期的前一天对不对?那这个怎么获取,前一天是不用data sub就可以获取,对吧?来把当天的日期2020杠零六杠幺五先放进去,后边呢再放个一,这是不是就减一了,相当于那前一天的分区咱们拿到了,拿到之后,我们把里边所有的字段都给它拿出来啊,我们先取一个UID,然后后边全部拿出来,那当然这个呢,我们需要给它调整一下啊CTRX诶。快速的调整一下ctrl a ctrl v,呃,CTRLF,我们搜一下这个逗号啊,选中哎,然后回车拿过来CTRLX。来放在这个位置好了,各位同学,那到目前为止呢,那我们前一个分区的所有的数据是不是都拿出来了呀,对不对?那接下来呢,我们继续往下走,下边是不是还得拿一下我们当天的下单记录的一个汇总结果呀,那么当天的下单记录呢,我们现在有异地表,你就可以直接从异地表里拿,但是没有,我们是不是得从明细表里去取啊,对吧?那现在呢,我们塞大价,然后呢,辅RA应该是DWD层的,然后是交易域的订单明细,这张表之后呢,咱们拿它最新一天的分区集合零六杠幺五好,那当然这个拿过来之后,我没有办法直接让它跟上边去进行去这进行照啊,我得保证这两边的力度得是一致的,我是不是才能照呀,对吧?我这张表我一行现在是一个用户,那这块呢,是不是也得聚合到用户力度才行,对吧?所以说在这儿呢,我们需要给它进行一个葛鲁外聚合的操作,对吧?葛谁呢就格user ID,那上边呢,咱就可以去选择user ID了啊,那之后下边我们选啥呢。
13:55
呃,是不是得选选一下这几个度量值啊,对吧?那首先这儿来一个度量值就是order count对吧?这个order count,那咱们这求什么,是不是直接来一个count distinct,然后谁就完事了,诶来一个older ID,那就完事了,这是不是就是下单次数对吧?当然各位同学这个下单次数,那在这儿它的含义应该是什么呢?应该是这个人在这一天里边的下单次数吧,对不对?OK,那在这儿呢,咱们给它加一个标记啊,在这儿我给他来一个older count,比如说ED啊,是这样的啊好,那接下来咱继续往下走,那下边呢,我们再算第二一个指标,也就是order number,对吧?Order number其实很简单,还是直接sum求和对上了对吧?哎,那这个我们得到的应该是诶older下限number后边来一个什么呢?ED,对不对,OK,继续往下走,那再往下的还是求和,我们来一个total about to amount OK,那这个呢,当然指的是older toal,呃,然后下边线amount,然后后边是不是给它加一个标注是ED啊,对吧,好,那我。
14:56
为了区分啊,我们把上面这也给它都加一个别名,这个呢,我们应该管它叫做count,应该是啥TD对吧?这是历史至今的嘛,这个呢,叫做O的L下角线nu,呃,Nu下角线应该是TD对不对?那这个也是一样的啊,CTRLC我给它复制一下拿过来,我们这来一个TD好了,那这样一来的话呢,我们前后两次查询就都搞定了,搞定之后他俩是不是得做一个全威连啊来按照我们刚才的分析对吧?来,那现在呢,我们就给他做一个全威连,这个拿过来,诶直接给它回,呃,CTRLV给它放在这儿,然后这儿往前推一下啊呃,这个咱们随便起个边名,我就管它叫做old吧,这也叫原来的对不对,那这个呢,是咱们今天的,那我就起为new啊来回车CTRV,那这个呢,咱们往前推一下,这个起为new,好,那完了之后old跟new就得做一个全外联副al join,那当然它了,Join的这个连接条件应该是什么呢?应该是UID吧,对吧?order.u点向前ID等于new.u.ID哎,这个没问题吧,好了,那。
15:56
那这样一来的话呢,前后就已经关联上了,关联上之后咱就可以从里边去选择我们想要的这个最终结果了,对吧?Select from他们好,那现在问题来了,上面怎么选呀。
16:08
对吧?哎,来咱们分析分析,一个字段一个字段来呗,先从第一个UID开始,这个我们应该怎么取,取谁,你要知道这两门的对应关系,它是不是是这种啊,对不对,这有U的ID,我这儿也有ID,我选哪边了呢?你选哪边都不合适,对吧?你选哪边是不是都可能会导致有一部分用户选的是空啊,对不对,所以这得怎么选NVL吧,没问题吧,OK,那咱们现在应该是NVL啊NVLOK,那然后呢,把谁放进去呢?哎,比如说把new.u.ID放进去,再把o.u.ID放进去,是是不是就OK了,对吧?这样一来我们肯定能拿到一个不为空的u.ID啊好,继续往下走,第二个字段。第二条是不是该拿这个所谓的older day first也是首次下单日期了呀,对吧?这个应该怎么拿?这个怎么拿,这个怎么拿,咱来分析分析啊,是不是还是得这样去对比着看一下,对吧,这个是O的,这个是new对吧?OK,好,这个怎么去拿呀,这个咱们得分情况去讨论了,对不对,OK啊来咱们怎么分情况,我们刚才说了这三这个用户呢,我们可以分三部分去看。
17:14
这一部分指的是什么?原来下午单,今天又下单了,这是原来下来,今天没下,原来没下,今天下来指的是这一部分,对吧?好,三部分咱们分别看,我们先看这部分。你说这部分人,那你去拿他截至15号的首次下单日期的时候,你怎么拿不变对不对,对不对,因为首次下单日期嘛,对吧,你原来下过单,你就已经有首次下单日期了,对吧,不管你今天下没下对不对,那所以说那这儿咱们拿的是不是都是原来的就OK了,对不对,同理这儿是不是也是一样的呀,对吧,这也是原来下过单的,所以他们这一部分人都是直接拿原来的首次下单日期行了,好,那剩下的这部分,这一部分人,他的首次下单日期应该怎么拿。你要知道这部分指的什么,是原来没下过的,今天的下了,那他是不是就是今天的新增下单用户对不对,所以他的首次下单日期不就是今天吗?对不对,那所以说现在大家应该就知道怎么拿了,我们得做一个判断,这部分人让他拿原来的值,这一分人呢,我们让他拿今天的日期就完事了,好,那问一下大家这一部分,这两部分人怎么怎么怎么区分开呢?你这不得做一个判断的区分一下呀,根据谁是不是根据old的ID去判断就行,Old的ID为空对不对,那我就用今天的日期,否则就是原来的日期,对吧,应该这么写啊,所以在这呢,我们写一个if就完事了,If if应该是哎,old.user ID is no对吧,为now,那我们就取new点,呃呃,一就就就取当天的日期对吧,哎,2020杠零六杠幺几啊幺五就完事了对吧?否则的话呢,我们就取old的里边的older date first是不是就行了,对不对,这个应该是没啥问题的啊好了,那这个咱们就搞定了,接下来我们继续往下走,那下边我们要取的应该是什么呢?末次下单日。
18:54
对吧,末次相日系怎么去?你看啊,首先这还是对照着看呗。
19:00
这个是不是也得分三种情况去看,对吧,这三种情况咱们分开讨论,先看这部分。这部分人他的末次下单日期,那应该娶谁呀?这部分指的是什么?指的是原来下过单,今天没下单对吧,那对吧,那原来下过单,你说有没有一个末下的日期呢。有吧,你下过单就有呗,对吧,有那完之后今天没下单,那你的墨S不还是上一个墨S吗?对不对,他应该是拿原来的值没问题吧,好接下来计划那这部分人。这部分是原来下过单,今原来下过单,今天他又下单了,对吧?那他的末测下单是不是就是今天对不对?其实这一部分人他末测下单日也是不是也是今天对吧?也就是什么意思呢?只要你今天下单了,那你的末子下单日期是不是就肯定是今天对不对?OK,那你今天没下就是原来的呗,就是这个逻辑啊,那所以在这儿呢,我们的判断应该是这么去判断啊,应该是来一个if if什么呢?If new点这个得根据new去判断了,对吧?哎,New点右在D就是右边,哎,如果是空is now对吧,为now说明今天没下单,应该用原来的值对吧?那是old.older date是不是那个last对吧?我们来一个last就完事了,OK,否则的话呢,是不是应该取今天的日期2020杠零六杠幺几?
20:12
幺五是不是就OK了呀,对吧?好了,那这个咱们就搞定了,搞定了好,那就来继续往下走,下边其实就简单了啊,下边是不是这些东西就直接加一下就行了,对吧?这个是截至14号的这个呃,统计结果,那这个是15号的一天的结果,他俩一加不就完事了嘛,对吧,能不能直接加,比如说在这呢,我直接来一个o DR count,这是不是有TD啊对吧?那完了之后呢,我再给它加上一个o count是不是有ED啊,来加上这样行不行?行不行行不行,咱分析分析啊,你要是直接加的话,可能会出现什么情况,中间这加没事对吧,那这一块呢,是不是会有一个闹跟一个不为闹的直相加呀,包括这也是一个nu跟一个不为闹的值相加,一个nu跟一个不为nu的值相加等于多少。等于多少,咱可以测一下对吧,我们拿一个来一,比如说我这加上一个哎,No,对不对,那完之后看到等于几。
21:02
它的结果是不是就诶还没出来呢,这是字段名啊I等1G啊等于闹对吧,是这样的,我说怎么还等等于成字符串了呢,OK啊,那这个肯定是没有问题的对吧,所以他俩直接相加是是为no啊,那所以说那咱这直接相加这个结果它应该是不对的吧,对吧,那应该怎么处理一下。哎,其实就NR就行了,对吧,其实大家应该能能想清楚,如果我这是,那我正常应该让它按按几算呀,按零算是不是就行了,对不对?那所以说在这呢,直接给它嵌套一个NL,那这个问题就算是搞定了,非常简单啊,那在这呢,咱们就这么去写就行,NVL先把这个值放进去,后边来个零,那这边也是一样的道理,RLX,我们来一个NVL,然后呢把它换进去,然后呢来个零,诶那这个就搞定了,那其他的两个字段是不是也是这么算呀,对不对,那这里边呢,一个是o number来写一下吧,哎,Or DR nu,然后呢,这来一个TD,那这呢,我们再来一个诶,Order number DR nu,再来一个ED就搞定了,这个呢,是啊,Tol,然后呢来一个TD,那这个呢再来一个edo,这个totl。
22:05
To,这个怎么不不提示了呢,我们再重新写一下啊,那这个拿过来,这应该是呃,Older total amount,然后呢,来一个ED那就完事了,对不对,那截止到现在呢,咱这个,诶每日装载的serve语句,那就算是完成了,诶那这样一来的话呢,我们每天是不是都可以利用一下前一天的计算结果呀,对吧,这个能节省大量的这个计算资源啊行了,那这个完成之后,视频我给他停一下。好了,各位同学,那咱接下来呢继续往下走,下面呢,咱就来分析一下啊,就是看一看我们这个东西,呃,能不能用union的方式去做啊,来咱试一下,这儿呢,我先写上一个方案一啊,来这个书法老不切啊,来一个方案一啊,OK,那下面呢,我们紧跟着一个方案二啊好,来算计问析这个东西咱还可以怎么做?呃,先说一下优念的思路是什么样的啊,首先union我需要先把也得先把前一年的结果拿出来对吧?OK,好,那玩意拿出来之后,我的这个结构应该是什么样的呢?应该是一个用户一行对吧?啊,一个用户一行后边呢,会有它历史至今的是不是各项统计结果,当然不叫历史至今,应该是历史截至前一天,对不对?是不是所有的这个汇总结果啊,对吧,放在这了,好,那之后呢。
23:19
诶,我是不是也是需要去从明细表,或者说从这个DWS层的ED表里,对吧,去取一下这个当天的结果呀,对吧,那当天结果呢,我也给他先汇总到用户力度,那也是果这样呢,汇得到每一个人在15号这一天的各项统计指标,对不对,那你优进完之后是不是就放在一起了,对吧,上下频对不对,那我需要怎么做。我得把同一个人的对不对,他的历史截至前一天和今天的结果是不是得加在一起,对不对?那怎样能加呢?很简单,我只需要做一个什么操作就行。分组聚合对吧,那按谁分组呢?关键问题是。按照U的ID分组吧,对不对?你按照U的ID分组,是不是能够把就是同一个人的两条记录分到一组,对吧?啊,那一个是历史截止前一天的,一个是今天的好奋斗意思之后呢,是不是对每个字段直接来一个萨姆求和,就能够完成这个相加的操作呀?
24:13
理论上应该是这样的,对不对?好,那下来咱们就来看一看这个要想实现具体怎么做啊,其实你实践起来你会发现可能还稍微有点有点小毛病啊,可能还不是那么的顺利啊好,那接下在咱们分析这个怎么做啊,首先我先把那两个子查询给它拿出来,哎,CTRLC把这个拿过来,拿了之后呢,放在这儿啊好了,那这个是不是就是我们的,呃,这个历史截至前一天的那个汇总结果呀,对吧?这个没啥问题,然后呢,我们再往下走,我们把这个紫砂群也拿出来,这个是什么?这是我们当天的一个计算结果,对吧?好,拿过来拿了之后呢,按照我们刚才的分析,他俩是不是需要先做一个union啊对吧?好,那现在呢,我们给他union下,Union咱们两种方式,一个是去容,一个不去容,我们这不用去肿吧,对吧,我写一个union啊,但是你写上那个union之后,你们发现他这直接就给咱们是不是提示了呀,对吧,提示了什么信息。左和右这两个子查群是不是有不同的这个列啊,对吧,一个是六,一个是四对吧,那显然是不能照不能进行妖捏的对不对?好这个差在哪了呀。
25:09
实际上是差在这两个日期上面的,对吧?OK,好,那现在问题来了,这个怎么处理呢?这个问题你要想让他这个一键必须得保证前后这两个字段得是对齐的吧,对不对,这个不对齐的怎么整呢?下边给俩字段对吧?那给什么字段呢?都给当天日期是吗?OK,那依据是什么呢?为什么都给当天日期呢?其实这个依据你要你要能好好想一想,也能想到你往上看啊,咱们看第一种方案,第一种方案你看啊,就是咱们再去取我这个首次和末次下单日期的时候,咱们要么就是取old当中原来的日期,要么就是当天的日期。对不对,不管是首次还是末次是不是都是这样的对吧?OK,好,那大家来看一下我上边是不是有原来的这个首次和末子验的日期对不对,也就是要么取这儿的是不是,要么就是取一个当天的日期啊,对吧?那所以在这儿呢,我们是不是可以先尝试着放上一个当天日期,然后一会看一看能不能取出来,能取出来就是OK了,对吧?好,那现在咱们先试一试啊,我先放一个当天日期零六杠幺五,那这个呢,我给他放在这儿,当然你得补俩字段啊,俩字段是不是咱都给它补上一个当天日期零六杠幺五,这个没有问题,对吧?好,补上之后,那现在是能够进行这个优键的操作了,那接下来怎么做的,是不是得分组聚合呀,对吧?按照我们刚才的分析呢,我们应该是做一个,呃,这个按照用户分组,然后进行聚合,对吧?那当然这个咱们要想对他分组聚合得是不是对它来一个子查询呀,对吧?那完之后前面就给大家讲过,就是两个子查询进行union操作,那之后呢,我们是不是就把它当做一个S去处理就行了,对不对?那完了之后呢,咱们需要把它放在一个括号里来拿过来,CTRLV这个呢,往前推一。
26:48
走呃,这个起个边名咱就叫T1就完事了啊,然后呢,咱就可以select from这个T1了,对吧?Select from t1之后,下边呢,我们给它来上一个是不是格Y啊对吧?那格外谁呢?就格Y这个user ID对不对?那完了之后我们继续往上看,那上边咱怎么选,首先user ID是不是得先选出来对吧?之后呢,下面其实就是到了关键的地方了,就是关键就是关于咱们这个首次跟末次下单日期怎么处理的对吧?OK,这个怎么处理啊这个东西。
27:19
啊,求最小最大行吗?行不行,咱们分析分析啊,各同学啊,那首先啊,咱们得知道就是这部分数据我给它union到一起之后啊,咱们得到这个结果,它是什么样的一个结构啊,其实咱们得到数据应该是这样的,大家都知道,就是我这一部分跟这一部分数据我们的对应关系应该是这种。没问题吧,啊就是这样的话,对应关系应该是这种对不对,那所以说我们在对它进行妖孽完,然后呢,再对其进行分组之后,对吧,我们这个一组里边,你说可能会有几条数据呢。可能会有一条,可能会有两条,没问题吧,OK,好,那你想一想,对于哪部分用户来说是两条呢?对于这部分用户来说是两条,原来下过单,今天又下单的,它是两条,没问题吧,OK,好,那对于这部分人来说有一条,对于这部分来说呢,也是有一条了,对吧?好,那我现在呢,我我我我我我们就得分情况去讨论,看一下我们到底怎样能找到我们这个所谓的首次下单日期,好那我们先说这种一条的啊,对于一条的而言,先说这部分,好,那你你你这个人是不是就只有一条数据,所以说你的这个日期你有的选吗?你没得选,是不是只有一个older date first对吧,因为在下边这个子查询里边根本就没这个人嘛,对不对,所以说这个不用选,你怎你随便来个函数,因为你这用的是什么,你这用的是分组了,对吧,分组上面之后,你是不是必须得用聚合函数对吧?你这随便来个什么函数,是不是都能够把这个值拿出来呀,对吧,对不对,这个应该是没啥问题的,接下来往下走,我们看这部分人。
28:49
这个也是只有一条对吧,只有一条对应的是哪条,是上边这条吗?不是,它对应的是下边这条,下边这条它的末次,它的首次下载日期对应的值是多少,是06115对吧?刚才我们自己给它放了对不对?好,那你想一想,你说这一部分人,那他的首次加载日期是不是正好就06815对不对?所以这个呢,我们也是随便来一个函数,把这个值求出来就行了,其实关键是哪呢?关键就是这。
29:12
对不对,这儿你到底应该怎么选,这儿你会发现这一个人他有俩日期啊,对吧,一个是原来的首次,一个是今天你写了的06215,对吧,那应该选谁,是不是应该选原来那个首次才行,那你怎样才能从两个日期里边选来,选出来什么呢?选出来就是原来那个首次呢?你得选一个小小的值吧,对不对,你原来的首次肯定是小于今天这个日期了,对不对?那所以在这儿呢,我们直接写一个啥就行了,直接写一个min,也就是最小值,那就完事了,应该是older data谁first是不是就行了,OK啊好,那这个写法大家可能看着比较怪异啊,这个能看懂不?我其实之前给大家讲过啊,就是两个子查询进行UN年之后,那他们是纵向的拼接,对吧?那拼接完之后,那他们就字段取谁来着?取上边那个子查询的字段对吧?那其实咱们现在是不是取这儿是不是代表这一列了呀,对吧?OK,好,这个大家一定要理解一下啊,好了,那这个是首次下单日期,咱这么取,那末次下载日期怎么取,是不是取最大值就行了,对吧?你末次也是一样的,对吧?那咱们数据呢,仍然是有一部分用户有两条,有的用户只有一条,对吧?对于一条的,你随便来一个巨额函数,把它那个值拿出来是不是就完事儿了,对吧?那关键是这块有两条的,它有一个原来的莫斯,有一个今天的,对吧?那你今天下单了,是不是应该用今天的呀,对不对?所以应该取较大的那个值,对吧?所以在这儿呢,我们来一个max就行了,OK,那这样一来的话,我们就能够拿到每个人的末次下单日期了,诶这样也行啊,OK,好,那这个搞定了之后我们继续往下走,下边就简单了吧,下边这是不是直接萨姆求和就行了,对吧?诶,我们这儿呢,还是取第一个子查询的字段对吧?这边呢,我们应该是来一个order count,是不是TD呀,对吧?然后CTRLDCTRLD直接往下走就行了,呃,首先我们把这个number给它,CTRLC拿过来放在这个位置,那这个呢,CTRLC拿过来一放在这个。
30:58
位置好了,那这样一来的话呢,我们这个方案二就算是实现了。
31:03
OK,两种方案其实都能得到咱们最终想要的结果,他们的结果肯定是一模一样的啊,行了,这个我就不再多说了,我把视频先停一下啊。
我来说两句