00:00
来吧,咱们就分析分析这张表给你了啊,表已经建完了啊,我现在想往这张表里导数据,你说咱应该怎么导?啊,分析分析吧。你就你就你就现在这个区就扔给你了啊,你说你第一件事考虑应该是啥呀。是不是得找表啊,你得知道我要往这张表里导数据,我得从咱们前面哪张表里去去去去拿对吧,对不对,有我基础数据来自于哪张表,这是咱们要明确的啊,然后很显然啊,很显然。在这张表里是不是很多的字段都是那种统计的字段呀,对不对,那可能他们是不是来自于不同的表啊,对不对啊,那所以说咱们得怎么做呀,咱们得逐个字段的去判断啊,这个字段我可以从哪获取,这个字段我从哪获取,是不是得这样去去判断呀,对不对,OK,那咱们来分析分析啊来我先说第一个login count。这个low income你应该求的应该是啥?是不是应该是每个user?
01:02
是不是是当天的吧,当天的每个user,它的login count是每个user的,对不对啊每个,那这个应该怎么通,怎么怎么怎么求。啊。啊,你要注意啊,其实这个有一个关键词,就是每个什么什么,其实只要涉及到每个什么什么了,你就应该想着得得干啥呀。得分组对不对,只要每个user,那我就得按照user分组,这肯定的对吧?啊是肯定的,OK,那现在咱们来分析从哪张表里去分组啊,哪张表里。刚才说了从哪上面里求求这个值啊,肯定是启动日志啊,这肯定写日志,也就是dwd star lockck,因为在DW star lock当中,这张表当中啊,我们每行数据所记录的是不是就是一次启动记录啊,对不对啊,那我要想求每个user的启动次数,那应该就是啥,是不是找到这张表,然后对谁分组,对user分组,然后呢,对。那个聚合函数应该是啥呀?是不是count星就行啊,因为咱们求的是统计次数,而那张表里一行就是一次,那多少行是不是就等于多少次啊,没错吧啊,那所以说这个直接看清就行啊,然后往下走,下边这个car count。
02:11
克的号呢,我们应该刚才也分析过了,这个从咱们目前这张,哎,那个购物车时表里是求不了的啊,求不了就只能去哪求啊,啊只能是日志里边去求action log啊,X log,那这个求的话,那是不是得先把加购物车的所有的记录先过滤出来呀,过滤出来之后再按照谁分组,有分组,然后再count是不是就可以了啊,这是它的这个求法,那下一个order count,诶这样来自于哪张表?跟订单相关,订单相关的我们有俩,一个是订单ino,一个是订单detail,对吧,那这应该来自于谁。我们其实要求的只是每个用户的下单次数,对不对,那应该谁就够了呀。In four就够了吧,有必要去明细表里查吗?没必要啊,没必要,那下来amount它从哪来?这个咱们说了是总金额,这最终金额对吧?啊,Final amount应该从哪来?
03:05
是不音份也就够了呀,因为这里涉及不到具体的商品嘛,涉及不到那就是引份,那也就是他这俩字段,他们俩可以来自于一张表对不对,然后大家要记住这样一个原则啊,就是来自于一张表的这个这个字段呢,我们尽可能啊移一条色弧给它求出来。啊,也就是说你这俩虽然呃这这俩来自于一张表,但是你千万不要分开去求,你应该一次性给它求出来啊,为什么?因为这是不是可以少算一次那个数据啊,对不对,你俩分开求,相当于数据你会计算两遍啊,那这俩咱们能一起求就一起把它求出来,然后下边他俩。很显然来自于谁支付表呗,啊支付实时表,哎,没错,那下边这个呢,肯定来自于。订单明细实时表对不对?那当然下边这个求起来是不是要感觉要麻烦一些啊,对不对啊,麻烦一些啊,那咱们接下来就一个一个去求啊,那已经明确了,我们需要从多张边里求,那多张皮边里求,那咱们这儿那个最终的这个思思路应该是怎么样的啊,你就逐个去求,一个一个先求出来,求出来之后再想办法给怎么办呀,再给它拼到一起,是不是放在这张表里就行了呀,这是咱们的逻辑啊,咱们先先分开求啊,分开求先求第一个字段log给count啊,那这个刚才其实已经分析过了啊,我们需要select,然后呢,From那张表DWD层的启动日志对吧?Log啊,然后呢,我们求的是当天的这个用户行为对吧?那所以应该怎么办?VDT等于2020杠零六杠幺四,咱们一起减啊,完了之后下一步怎么办?
04:40
下步怎么办?咱们要求的是每个用户的登录次数对不对,那所以得干啥在格Y对吧,哎格Y格BY谁user ID啊对不对,然后呢啊得统计得得选吧,你得选出来是哪个用户,今天一共活跃了多少次,是不是得count一下了对不对,是不是这样求就完事了。
05:03
啊,没错啊,但是呢,这个思路很简单,但是这个如果真这么去写的话呢,啊,这个很容易出问题,很容易出什么问题呢。来咱们观察一下dwd star log这张表当中的这个数据啊,找到dwd starog在这呢,对吧?啊点开点开之后呢,咱们来看一下这张表啊,这张表一行数据就是一次启动记录,这个没错吧?啊,然后往下看,在这里边确实也有一个user ID啊用户ID对不对,但是你要知道啊,咱们这个user ID。啊UID有没有可能是空。在这张表当中,有没有可能很有可能啊,很有可能对不对,因为什么?因为我很有可能有些用户我启动的时候呢,并没有注册对不对,或者说并没有登录对不对,那这样一来的话,那是不是就有可能这里边会有闹啊,啊而且为闹的这个字段是不是可能还比较多啊,那要比较多的话,那你直接按照U的ID分组,那这样会出现什么问题?
06:02
是不是no这个UID为闹的这个值是不是全跑到一个分区里边去了,对不对,这就会出现什么。出现什么问题?数据倾斜问题啊,对不对,那之前还有同学问过啊。你说咱们这儿什么,呃会出呃会出现什么问题,如果说这个有点伪闹闹,是不是有可能会处理倾斜呀,对不对,那咱们这个倾斜在这儿怎么怎么处理一下呢。嗯,咱们这为闹的数据,你说咱们需要他吗。不需要我们统计的是什么,是user对吧,对不对,你你你user ID没有,没有的话,你是不是相当于你没有注册或没有登录,那所以说你在我统计范围之内吗?不在,所以这user ID为not,我们不需要,所不需要的话,直接过滤是就可以,所以咱们这and一下啊,And user ID is not not is not。嗯,No啊,这是咱们需要去诶注意的一个事儿啊,需要注意的一个事儿,好了,呃,这个相当于完成了第一个统计了,第一个统计完之后呢,我们一会需要,是不是还得把这个值得拼起来呀,所以这个统计是咱们一会需要用的,那我起个别名,咱们就叫做logging in给count啊,这个搞定,这是第一个字段啊,那接下来咱们去求下一个。
07:15
下一个叫啥叫做加入购物车次数,那这已经分析过了,我们只能去从DWD的X log当中去求对吧,找到这张表,那这个具体这个搜数咋写,咱so咋写,首先咱得过滤对吧?那过滤首先按照DT先把一天的数据过滤出来啊,然后呢,还把什么样的过滤出来呀啊还得把这个XID等于part I的这个字段是不是得得得过滤出来啊啊然后再一个呢,User ID不能为no。是不是也是一样的道理啊啊OK,把这个过滤了,过滤之后那怎么去处理呢?是不是得按照谁分组。按照UID分组呗,对不对,然后呢,直接count是不是就行?哎,没错啊,就这么求呗,啊来,那就来把这个circle快速的写一下啊,这也比较简单,那select,然后from dwd层的,呃,DWD层的应该是action log AC减X log,然后呢,先过滤DT2020杠零六杠幺四,咱一起写啊,先下一个按呃,应该是action ID等于谁,Card card,然后A对吧,然后再下一个呢,再and and and user ID is not now啊,Is not now。
08:32
好,那这个过滤完了,完事之后呢,需要格入BY啊,因为咱们要求的也是每个user字的什么,对吧,只要是每个你就记得得格入BY就行了,那user ID,然后下面呢,看得清,那这个是不是也搞定了啊,也比较简单啊,这都是小事,那接下来咱再往下啊,下边的该谁了?该这个下单次数下单及额了,对不对,那刚才咱们说了,那这个这俩字段呢,我们是不是出自于同一张表啊,出自于同一张表,尽可能一条S给它求出来,避免数据的重复计算啊来吧,往下走。
09:03
Like,然后from应该是哪张表?刚才分析过了,是DW层的fact。Older in吧,Or DR in啊,OK,那我们要过滤的是什么?应该是。是不是应该过滤当天的这个订单呀,对不对,当天订单,那这张表我们是按照什么分区呢。日期分区,每个日每天的分区当中存的就是啥?存的是不是就是当天的订单,那所以说是不是直接过滤当天分区的数据就够了呀,那OK where dt等于2020杠零几零六杠幺四啊幺四,那好我们现在要统计的是每个用户的下单次数和下单金额,那这张表当中它一行数据就是一个什么一个订单啊,那我们要算的是每一个用户的,那所以说得怎么办?每个用户是不是还得是按照用户ID进行分组啊,那这个还有必要按照user ID先去去个重,先先去过滤一下什么user ID不是now吗?需要吗?不需要,为啥,因为我们大家都知道,你下单的时候,你肯定得怎么肯定得是登录状态,所以说你UID肯定是有的,对吧?所以说在那呢,直接这个啊,对它分组就行啊,完了之后上边咱们选所需字段,第一个是user ID,那第二一个是啥呀。
10:22
第二是啥啊,应该是Co count清,这就是啥,每个用户的下单次数,那还有一个下单金额是不是得求和了呀,那求和求和咱们金额呢,其实前面说了有好几个am,是不是有这样的几个呀,有原始金额,优惠金额,运费等等等,那咱们这说的是谁用最终金额,咱们用最终金额啊,Final amount啊,咱们用它好,那这样一来这俩值也求出来了,我们把这个别名也起一下吧,这个叫做card a啊,这是上一个表的了啊,Cart ADD DD,呃,Cart count。Co,那下边这个呢,叫做older count和older amount对吧?Or DR啊,下选Co,那下边这个呢,叫做older amount or moment是不是搞定了啊,那这就是我们这个字段,那剩下的还有一个呃,Payment啊,那这个其实相对来说是不是就比较简单了呀,跟O应该很像吧,那所以咱这儿呢,直接把这个复制一下,给它改一下就行,CTRLC来往下走。
11:24
咱们改一下啊,那首先表里改一下,改成DW payment in for吧,啊pay。没错吧,那下面这个金额是不是得改一下金额改成payment amount,那这个count金是不是也是一样的呀?一行数据就是一次支付记录嘛,所以咱们只需要把这俩地方再改一下就行,来把这俩order给它改成,改成payment。哎,Pay nd,哎俩俩地方一块改行,那这个是不是也搞定了。没问题吧,呃,这个需不需要改一下,我看啊,呃,不用了吧,啊从这张表里把当天分区的数据拿过来,按用户分组看得清萨休克,诶完事,好,那这几个作用都很简单,那接下来我们重点啊看最后一个。
12:11
最后一个咱们怎么搞,这个需要咱们琢磨琢磨了啊,这个怎么求。嗯,来吧,咱们先思考一下嘛,啊,我们在这儿呢,首先咱们先不用考虑这个数据的这个格式。啊,咱们得先干什么呀?先干什么呀,咱们呀,得先把这个字段所需要的数据是不是得先求出来。求出来之后呢,再想办法呀,把数据给它整理成这样的一个结构,是不是应该是这样的一个思路啊,对不对,那这会这个数据你想求的应该是什么呀。这个数据应该是每个用户,然后呢,在这一天当中所所购买的所有的SKU的什么ID啊,件数啊,个数,以及什么这个次数,还有金额,对吧?啊是这样的一个东西,那所以说我们现在得得先去求这个数,求完数之后再想办法给他,诶封装OK,那接下来咱们去求啊,咱们要求的是每个用户一天当中所购买的每个SKU的各种信息。
13:19
啊,每个用户购买的每个SKU对不对啊,把这得明确啊,首先这个数据呢,肯定是来自于咱们那个,哎,欧比O这张时表的啊,所以咱们先把这个求一下啊,把这个词数也写一下select。From dwd层的fact older detail吧啊,然后日期呢,DT等于2020杠零几00214没错吧?哎,把分区先管理出来,OK,那接下来求吧。嗯,接下来怎么办?注意啊,是每个用户购买每个SKU。啊的各种信息啊。
14:00
前面提到过,只要涉及到每个就得分组,对不对?那咱们这儿按谁分组?啊,首先肯定得按照用户分组,这个肯定是这是必须的,对吧?跟搁入外U的ID,那如果搁入外U的ID之后,那咱们,嗯,你想一想啊,搁入YU的ID之后,你相当于会把什么样的数据分到一组啊,是不是把同只要用户ID相同就会分到一组里,对不对啊,那还能体现出来他购买的那个商品的信息吗?是不是不能了,我们得把每个用户购买每个SKU的信息是不是求出来,所以最终咱的结果应该是每个用户购买了什么商品,购买了几次几个,然后多少钱啊,每个用户购买呃哪种商品,然后呢,几次几个多少钱是该是这样的一个结果呀,所以结果当中咱们不应该只有user ID吧,还得有SQID对不对,那所以还得还得搁入BY谁是不是还得格入BY一个SQID啊哎,咱们得格入BY2个字段。啊,那这样一来呢,就会把什么样的数据分到一组里边了,是不是就是同一个用户购买的同样的sko是不是会分到一个组里边了,没错吧,啊,OK,那咱们把这个记住啊好,那现在呢,我们这边就选啊user ID SKU ID啊那购买了几次啊,那上面让咱们求的有啥呀,是不是有呃,几个这个是几次,这是一共花了多少钱啊,那个数次数金额呗。
15:30
啊,那个数怎么求啊。个数的求,咱们点到这张表啊,这张表当中是不是就有一个SQ number有它,那是不是对它直接进行求和是不是就行啊,那所以说个数那就直接sum啊,Sum是sum SKU number啊,那这个次数呢。这个次数怎么求次数,因为在这一行里边啊,在在这张表里,这张表里这面里我一行数据就指代的什么,指代在这个用户是不是购买了这个SKU一次啊对不对,那所以说你要想求次数,其实就数什么,就是行数,行数就是count行啊没错吧啊,然后再往下走,那下一个就是那个金额了,对吧,那金额呢,咱这是不是就直接求和就可以啊,那金额呢,咱们这儿是不是也有多个金额,那这边咱们用谁也用这个最终金额啊,所以这边呢,咱们sum来应该是final amount b是不是金额就搞定了啊,也就是到现在为止呢,我们已经把我这儿所需要的所有的。
16:33
数啊,所有的值是不是已经求出来了,那求出来之后,咱们要做的就是想办法给它封装到这样的一个结构当中啊,我先把这个别名写一下,这个叫做s ku number,那这个呢,叫做S,叫做order count,对吧?诶,不是SK number吧,叫什么?怎么number叫做,诶,就叫SK number啊,Order hunt order amount,没错啊,那咱们给它啊,跟它统一就行啊,Order I count下边的叫做older amount am没错吧?哎,先先把别名写出来,然后我先让它执行一下吧,执行时咱是不是可以看一下这个效果呀,对吧?先看现在这个数据是什么结构啊,这个因为第一次跑可能比较慢啊,需要出手按SP的绘画啊,稍微等一下。
17:16
啊,这个结构应该是怎么样的呀。应该是一行数据,指代的应该是一个用户当天所购买的一个SKU,没错吧,啊,来,咱们等着这个结果啊。一个用户一行数据,就是一个用户所购买的一个SKU啊来出来了,你看是不是这个结构来啊,这是一个用户啊今天所购买的一个SKU,然后多少个多少次啊呢,多少钱是不是这样的呀?啊没问题吧,诶你看这哎这比较比较比较比较给力啊看这啊这一个什么是是不是U的ID相同的对不对,这相这说明是什么,说明这一个U字,今天是不是买了两个SKU啊对不对啊让大家呃,然后前面有同学问我啊说诶为什么老师我这个查出来的结果跟你那个不一样呢?啊这个很正常,因为咱们每个人的数据都不一样,我每个数据是不是都是随机生成的呀?啊所以说跟我这不一样很正常啊,很正常,不用非得一样啊。
18:16
好,那是不是就有这样一个现象,这是咱们最终结果了啊,那这个我怎么样把这样的结果转成哎,咱们这样的一个结构。啊,怎么转。怎么转?首先咱们得考虑到一个啊力度的一个问题啊,那这个结构啊,啊,我一行数据应该是一个什么,是一个U字吧。对不对,一个U字一行没错吧,但是刚才你看咱们这个结果这一行是什么?一行是一个用户所购买的一个商品吧,那所以说首先他俩力度现在都不统一啊,那一会儿你要想统一了得怎么办呀,是不是肯定会对这个结果进行一个聚合,按谁聚合是吧,U聚合,那U聚合之后是不是相当于能够把一个用户所购买的所有的SKU是不是放到一起啊,啊对不对?哎,OK,这肯定是一会一会要做的一件事儿啊,那咱们除了要做这件事,还得做一件事,是不是还得得到一个结构体呀?啊,咱们这应该怎么个顺序,应该先怎么做?
19:17
先先怎么办?哎,大家可以观察一下啊,你说这四个字段,这就是啥。是不是就是咱们一个结构体当中的四个字段呀,对不对,所以说我现在可以先怎么做,对,可以先把这四个字段,先把每一行的这四个字段都怎么做,都封装成一个结构体,先封装成结构体,封装成结构体之后再怎么办。再按照UID分组,然后把结构体交给谁,交给collect set或list。那是不是就直接把你结构体封成数组了,是不应该是这样的一个思路啊,那所以说咱们现在呢,这个思路明确了啊,就是先把这四个字段先给它封装成结构体啊,然后呢,再把结构体交给collect list或collect set给你转成数组来完事啊好,那现在咱们来考虑一个问题啊,就是怎么将这个东西转成结构体。
20:10
怎么转?怎么把这四四个字段封装到一个结构体里边?咋封装啊?啊。等风。是不是得去have的官网上找函数啊,对不对,那怎么得到结构体?咱们刚说的是不是有俩函数,一个ru一个namedru呀,咱们用谁用谁就可以用name的ru就可以对吧,因为我们这个字段名呢,不能让他使用默认的CALL1CALL2对吧,咱们是有字段名的,所以说我们应该用这个name的,那这个到底怎么用啊,给大家来演示一下。好,那往下翻,往下翻啊,那现在相当于这个东西是我们的一个是一个这个咱把它先当做一个子查询吧,这一个子查询啊,CTRLX一下啊,来我们select l CT select from from,咱们刚才这个子查询啊。
21:06
来来,括号。那既然要让我们的让得干啥,是不是得起别名啊,得起别名啊,咱们叫做tmp吧,叫tmp,那现在我们从刚才这个也就相当于是不是从这个结构当中去查查查出去啊,对吧,那咱们要封装成结构体了,怎么封装啊,那首先user ID不属于结构体吧,你就单独拿出来就行,然后要剩下四个段,是不是得放到结构体里,那应该是怎么样怎么办?应该是name的sruct,对吧?啊然后呢。啊,然后呢,往里边写啥。啊,是不是应该写第一个字段的名字啊,你看啊,这个使用方法是不是NAME1Y1内2Y2啊对不对,咱们四个字段你就一个一个写呗,先写第一个字段名,第一个字段名应该是啥。应该是SKUID吧,你是不是得看着这个写啊,看这个写啊,SKID,那当然这个字段名应该是一个字符串吧,所以SKU相当于ID啊,那下边第二个值应该是啥?应该是SKID对应的那个值吧,那个值是谁值是不是就是它没错吧,那所以把它拿过来呗。
22:10
CR对吧,然后下一个字段该谁了,该SK number了对吧?啊,应该先写K,再写Y6啊,然后下边呢,SK number啊,然后下一个啊,应该是older count啊,那这个呢,也是older count吧,啊没错吧,然后再往下下一个最后一个啊,Order want。Aman,然后逗号来一个O好吗?哎,是不是没错啊啊OK,那这个做完之后呢,我们可以尝试着去查一下这个数据走,你看它是不是变成结构体了啊,首先这个行数变没变,行数没变对不对,因为内是不是一进一出啊,相当于我进来一行出来一行,只不是把你多个列,是不是给你分到一个列里边去了呀,OK,那你看。这是不是咱们现在的这个结结构体啊,对吧?哎,K1V1K2V2K3V3啊就是这样的啊好这个搞定啊,完了之后咱接下来是干啥,是得把结构体封装到数组里边对不对,那这个还得怎么办?
23:12
是不是得先聚合,然后呢?再再先先分组,再怎么先分组再聚合对吧?那咱们需要可如何?Y谁UID吧u.ID啊,下划线啊ID啊,然后呢,把结构体这一大行是不是放在一个collect例子或collect set函数当中啊,那这个看你有没有去除的需求了,咱这有吧啊Co咱这应该是没有的,对吧?没有的话你用list s都可以,那CTRLV放在这儿啊好,那这时候我们再来看一下最终的结果什么样的啊来我们执行走。看一下结果啊。哎,你看现在是不是就封装到咱们这个一个数组当中了呀,对不对,你像这种77这个人,很显然他今天买了一个十号商品,买了一个12号商品啊,你像这个人只买了一个13,对吧?哎,就是这样的一个效果啊,那这样一来的话,咱们就已经能够保证我是不是一行数据就是一个user了呀,啊对不对,诶,这就是我们最终的这个结果的形式啊好,那这边我们给它起个别名,因为一会需要用它啊,咱们叫做older啊,Detail detail,然后呢,Stas。
24:25
Older detail space,哎,订单统计行,那这个我们所需的所有字段是不是都搞定了啊,都搞定了,好,那搞定之后咱们需要哎做最后一步,最后一步干啥呀?最后一步是不是得把这里边所有的字段得拼接起来,然后放到咱们这张表里啊,啊,那这个怎么拼接呀,这个拼怎么拼啊。品。啊,怎么拼,是不是就是招呐,啊就是没错吧,是不是就是招啊,就是招啊,因为大家得知道啊,咱们这个所谓的拼,咱们在这是怎么拼,是不是每个子查询有我们这个最终结果当中的一个或者是两个字段呀,对不对,那所以说咱们应该是横向进行拼接吧,是不是把多个字段拼到一块,那所以肯定用的是join嘛,那肯定是join啊OK,那接下来咱们就开始写这个join了啊好,那在这儿呢,给大家先介绍一个这个啊,一个新的语法啊,叫一个新的语法啊,你会发现啊,咱们在这儿。
25:23
啊,咱们在这有什么,是不是有多个子查询啊,而且非常多吧,好几个,那所以说你要是这么多的子查询,如果说你要写这个呃,Join语句的时候呢,如果写就就以什么,就以那种普通的括号加别名那种子查询的方式去写,那你这个so看起来是不是比较的乱呀,对吧,可读性比较差,所以所以在这儿呢,咱们可以有一个这样的语法啊,这个语法叫什么呢?叫做with eyes语法。啊,V斯艾啊,然后先写一个with,然后呢,我们写一个什么呢,写一个别名啊,就现在你相当于先怎么样啊,先声明每个自查区相当于是啊,比如这样呢,写一个什么,写一个别名啊,就相当于正常情况下你是不应该给它来个括号,然后写一个别名啊,这块先变了,我先起别名啊with tmp,咱这个叫什么叫log in吧啊然后后边呢,我们写一个。
26:15
Is啊,写S,然后呢,把这个子查询CTRLX,我们放到一个括号当中啊,CTRL为。哎。这不这么写啊,那你这么声明完之后呢,那你一会儿你是不是还会写这个select from这个别名,这个查询啊,对吧,那到时候你还需要呃,这个在后边直接一个括号去编名吗?不需要了,怎么办就行了,直接用它这个表名是不是就可以了,那就是后边你就可以直接select什么什么from t MP log in了。啊是这样的啊,哎,这是这个语法,然后这儿大家需要注意的是什么啊,就是在have当中,这个with as这个语法呢,没有优化效果啊,没有优化效果也就是它不会说,哎,我对你这个表表啊,对你先做一个缓存等等等,不会的啊,就跟我们普通的子查询是一样的效果,能理解吧?啊这个是没有优化的啊,只不过就咱这么写的话呢,我这个代码的可读性要高一些啊,要高一些。
27:14
好,那这个咱们接着往下走啊,那with t m PS,那咱这是不是有多个自查群啊,那多子查询咱们得怎么办?哎,是不是得,那还用再选再选with吗?不用了,就直接接着写什么就行,哎,表名as什么表名as什么啊,当然呢,多个表名之间我需要用逗号分隔啊,先写一个逗号,然后呢写下一个别名,下一个呢,比如我叫做。Tmp,然后呢CRT空格艾啊,然后回车里边呢,咱们来括号啊,把这个自查询给它放进来CTRL位啊,然后呢,往前推一下。能看懂吧,哎,就是这样去声明啊,那包括下边呢,也是一样的道理,那接下来我快速的把下边给它搞定啊来快都搞定,那第一个表呢,咱们讲细一点啊,咱们TMMP这个叫啥叫做呃,O啊,Tmp order啊or DR,然后is啊回车来来括号。
28:09
然后呢,把咱这个东西CTRLCTRLX放在里边来啊,CTRLV。推一下里边分号去掉啊好,那再接着往下走来逗号该谁了?该这个tmp payment了,对吧,那CTRLX,那这边TMMP,然后呢,呃,PMNT,然后艾啊,然后回车。来放进来,CTRLV这个呢,咱们也给它推进来,好,那最后一个了啊,来这来个逗号,下边应应该叫做tmp啊,应该叫做呃,D t TP detail对吧,那OK,咱们把这个拿过来。CTRLX啊,还丢了个X是吧,X来。好,给他放进来。诶,这个。
29:01
我看看这个,诶。呃。哪需要往前推一下。是不是?我这个对应关系,我怎么感感觉这个不太对了呢。哎,这样是不是就行了。呃,诶,我是不是少沾了呀,看一下啊select from。哎。呃,从从从从上面开始啊,这个对应关系搞差了,应该是从二到。到到到到到这个位置往下对下,哎,这回就对用找了啊,是不是就对上了,行啊,那这个缩进呢,最好搞清楚一点,因为你出问题之后,你是不是一层一层的这个好找啊,对吧?啊好找好了,那这个t MMP detail艾特他就完事了,最后就不用再写逗号了,最后就不用再写了啊,那接下来相当于你这是不是声明了这么多自查询了呀,然后现在你就可以写你的逻辑了,我们现在逻逻辑是不是要把它们几个拼接起来呀,对不对,拼接是不是就得用join呢,对不对,也就是你需要select,然后直接写select就行了啊select你比如说我这个不写逻辑写啊,就比如select星,然后你就可以上边你的tmp各种东西了,就这么去用,能理解吧,就是在上边我声明,哎,紫砂学下边的你就可以接着选了啊,然后这个中间不需要加任何东西啊,哎,OK,把这个搞清楚行,就这么去用啊,完了之后咱们来看一看咱这join的话应该怎么join吧,来咱们来捋一捋啊,这块怎么join。
30:28
待会儿咱们怎么join?嗯,怎么着呢?好几个进行好几个表进行召唤,对吧,咱们这怎么怎么写怎么召唤。啊,这个怎么搞啊,咱们。想一想怎么搞?怎么搞?咋写?嗯,用用怎么着,是不是就考虑用哪种招唤方式呗,对吧,啊怎么着呢。
31:04
啊,用内联行不行,就因当行不行。In,咱们思思考思考呗,因为一点证啊,那比如说我这个第一个表TP login,那首先这张表当中啊,那他的这个user都是什么样的user啊,都是今天活跃的有登录的userr对不对啊,今天登录过的userr啊,那所以说今天登录的userr呢,我可能有这么多,那d MP card里边都是什么样的userr啊,都是今天加过购物车的这个userr对不对?那你说他俩这个user是肯定是一样的吗?不一定对吧,那可能后边是不是比较少啊,那同理,你后边下单的,你支付的会越来越少,对不对?所以说你要是用这种呃,Inner照的话,那你直接照之后是不是值返回每个里边都有的呀,是不是只有这点了呀,你像这些这些人是不是就没了,那所以这个呢,咱们肯定是啊,不允许的。啊,肯定不行,那用谁呀。啊,那用全外联肯定没问题,全联不肯定能返回所有用户啊,对不对,或者咱们这还可以用谁呀。
32:06
还可以用什么?还可用left对不对,Left行不行啊。行行不行,咱们来思考一下啊,那用left肯定得有一个最左边的对不对,谁是最左边的呀?TP log in登录的坐在最左边的对不对啊,因为什么呢?因为大家肯定想的是这个啊,我如果说。呃,这个呃,先把登录的放在这儿啊,如果说我后边我下单了,我支付了,那你今天肯定怎么样了,肯定活跃,肯定登录了,对不对啊,那确实是这样的啊,如果咱们就这样去思考,那所以说我们这儿可以把tmp log in放在左边,然后让后边所有的表to跟tmp log做一个left join,那这样一来的话是不是,哎,这个咱们反过来结果肯定也是全的呀,对不对,但这样真的对吗?啊,我们想的好像是这样的啊,因为什么,因为你要想下单想支付啊,你肯定得登录啊,确实是这样的。
33:01
啊,没错,这个是对的,但是你要思考一下啊,咱们这个TP login里边的user是怎么来的。是不是从咱们那个启动日志表当中拿的呀,对不对啊,那大家跟我思考一个这样的问题啊,有没有可能有这样的现象啊,我这个用户呢,我这条启动日志是什么时候什么时候发的呢?是6月13号。啊,然后呢,这个半夜这个比如说23:58,哎,这个生成的对不对,那也就是说你登录是不是在13号登录的呀,十号登录你13号的启动日志,那是不是就发到了13号的分区里边去了,再就是你14号的分区里有这个人的登录日志吗?是不是没有。对不对,但是我下单我支付是在哪一天做的,14号做的,那所以说你要这么去考虑的话,那tmp login当中是不是也不一定就有咱们所有的user啊。
34:01
那所以说用left round还行吗?那那就是不是就不行了呀,那不行了,那不行,那所以咱们这只能用谁只能用全外联了啊,只能用全外联负al之啊那以咱这呢,把这个去写一下啊,来for,来let's select from from哪张表from,咱们这个应该是首先第一张表应该是tmp,老既然全外联,其实这个顺序是不是就无所谓了呀,对不对,那from它啊,然后呢,我让他去,哎这个负al John c tmp,比如说car吧,比如car啊,然后后边咱们这个连接条件应该怎么写啊,On tmp login.user ID等于t car c.user ID没错吧。这没错吧,啊,然后接下来往下走啊,那再负auto啊for该谁了,该TB,比如说order对吧,然后后边on,哎,关键这个on这个连接条件咱们怎么写。
35:03
这个怎么写?那肯定是呃谁谁谁的,比如说谁的这个哎,User ID啊,是不是得等于咱们这个tmp应该是o.o点,哎有点ID对吧,我肯定这么写,关于这个问号,这咱们怎么写。写谁?这个咋写?啊,全外联咱们肯定之前都写过,但是多表全外联我们大家可能没写过,对吧,这儿可能没写过,那你说这怎么办。这咋咋处理一下。你得考虑一个问题啊,你你大家知道这个多表照的时候,它那个顺序是什么样的吗?啊,比如我现在两张表照两张一张啊两张,那他俩是不是就照照完事就就就就结就结束了呀,对吧?那假如说我现在是多表照,我还有第三张表,那应该是怎么照呢?这边是前两张表照完之后,是不是有一个虚表啊,然后虚表去跟第三张表照吧,应该是这样一个逻辑啊,没错吧啊OK,那现在咱们就是这样的一个现象了啊,那所以说既然是这个虚表去和咱第三张表照,那你说这个。
36:07
连接条件的应该怎么写?来,咱们琢磨琢磨啊,来看一下,假如说我第一张表tmp login没错吧,那第二张表呢,比如说我这个t MMP cart,这是log in,这是cart,那它俩转完之后是不是会有一个区别啊,那它是不是跟咱们第三张表older表镜照呢?那假如说我们这个对应关系是这样的啊,这是older表。啊,那你说他们这个join的连接条件该是谁?你这应该写的是tmp login.uid等于older的ID,还是TP card的ID等于older的ID?这个问号到底应该写谁?如果说大家想啊,如果说我写log in,如果写它,写它的话会不会有问题。其他的话,这部分是啥?这部分是不是补now啊,因为前两张本是全外连,这部分是不是补now对不对,那本来这部分数据我跟OLDID是不是能join上了呀,但是因为什么,因为你这你写的是now,你用now跟它是不是就join不上了呀。
37:05
哎,是能照上的吧,啊,结果你这因为你是闹,所以你这就结果导致照不上了,这肯定有问题。能理解吧,那所以说你能用什么TP login.id去跟他照吗?是不行,那应该有谁?用car ID car ID是不是也不行,Car ID假如说我后边这个表啊,我比较长,我这么长。回到这,那你这部分是不是也是闹,这跟他是不是本来是能照上的吧,结果这你用not照是不是也照不上了,所以肯定不行,应该用谁呀,因为这个虚表的ID就跟能照呢,对那虚表的ID咱们怎么怎么找啊。是不是应该得判断一下呀,对不对,怎么判断。用谁就行,在这儿。NVL是不是就行。NVL啊,NL是谁?N v l TP login.id然后呢,在。car.id也就是他就会判断了,判断什么呀,来判断哎,它的ID是不是为闹,如果不为闹是不是就用它,如果为闹就用谁为闹是不是就这部分,这部分是不是用它就行。
38:04
能理解吧啊,咱们这呢得这么去做啊,我说这个多表进行全外连的时候呢,这个连接条件一定得注意啊,那这儿呢,你就NVL呗啊NVL把这个就拿进来就行了啊,拿进来应该是tmp,哎,login.id然后呢逗号啊tmp。来一个cart,然后点user点是不是得这么去写了啊,得这么写啊,那这个玩意之后咱们接着走,是不是该往后进行照了呀?呃,Tmp该谁了,这次。该该谁了,该payment了是吧?该填payment啊,我跟他照那这个连接条件,这回该怎么写,这回是不是前面有三张表了呀,来一张两张三张来,然后跟第四张表照对不对,那是不是应该用这个。前面三张表的这个不为not ID去跟第四一个照呢,对不对,那这个怎么写?
39:03
用NL,哎,对,有没有想到是不是用NY嵌套一下就行了呀,对不对,那先把这个拿过来,然后呢,外边再嵌一个NVL,然后里边写谁。逗号,然后第三一个表达ID是不是就行?哎,没错,这样可以,或者说在这呢,我们可以用另外一个函数,另函数就没必要嵌套了啊,另外一个叫什么呢?叫做coal啊,就这个这函数啊coalless,那coalless这个函数呢,你可以怎么理解啊,你把它理解成一个增强版的NL,可以这么理解啊,怎么能相反呢?NVL是不是只能传俩参数,那它呢,可以传任意个参数啊,然后呢,它的逻辑有什么?就是从第一个开始判断,第一个不为闹,那就返回第一个,第一个没闹,那就判断第二个,依次往后判断,能理解吧,那坐咱这呢,是不是可以直接用它就行了呀,那来一个先写第一个tmp应该是log,然后点U在ID,第二一个是谁tmp,然后呢,Car,然后点user ID,那第三一个tmp payment,然后点就ID是不是这么写就行,哎,你就一个一个来123是不是三个全写进来了,然后让他去等于谁等于咱们那个T。
40:13
P啊,Payment点有点ad能能理解吧,啊能理解啊好,那接下来最后一个了啊,这个确实这全外连的话,接下来要复杂一点啊,那最后一个照谁照O这个detail detail啊,然后呢,后边来一个二啊,是不是还得是Co函数啊对不对,那咱们需要把前面这几个。是不是粘过来啊,来CTRLC。CTRL,喂,然后呢,还得再补一个吧,再补上谁tmp啊然后呢,P payment点再补是该跟谁呢?咱们咱们少写了一个是吗。啊啊啊,这这里边是吧,这里边应该写的是older才对啊,应该是older,没错啊,这个是older啊,然后后边等于payment的对吧?那所以这儿下边应该是先把这个呃,O写上tmp啊,应该是o.user a。
41:09
没错吧,然后呢,让它再等于谁等于最后一个啊tmp detail点标点ID,这个没错吧,哎,这个就完事了,这是咱们这个连接条件这个写法了,这不要写下来,就这有点麻烦啊,就有点麻烦啊好,那完事了,完之后那上边咱得选啊,咱得选里边呃这个字段了,得一个一个选了对吧,那首先我们呃先选第一个吧,咱们要选的第一个应该是谁。啊,CTRLC咱们盯过来啊,盯着照着写啊来第一个是UID,那UID咱们怎么选,选ID其实就挺麻烦,你想一想啊,我们这是多个表进行全外连对不对,那你选哪个自查询的user ID啊,选哪个是不是都有可能有now啊,咱得怎么选呀?是不是得判断呀,从第一个开始呗,选第一个不为闹的就行,对吧,用谁就行。
42:00
CL是不是就可以那把它拿过来CTRL,诶没拿过来啊,CTRLC那放在这个位置,CTRLV,那咱们就直接把每个子查询的ID是不是都给他扔下来就行了呀,那他自己去找不给闹的那个对吧,那就第一个tmp,然后呢,应该是那我直接拿下面那个就行了,哎,那下边最下边那个诶往后拉。到这CTRLC,那最下边这是不是还得补一个呀,啊,还得加一个,加上最后那个tmp,哎,这个detail点啊,给它放在这tmp detail.uid没问题吧,这个UID咱是不是就能找到一个这个正确的UID了呀,那接下来往下走,那再往下咱们找谁?呃,Log in count login count应该大家都知道,他肯定来自于谁,肯定来t me log in对吧?啊,但是你得考虑一种情况啊,一种什么情况。包括其他都是一样的啊,因为咱们是全外联啊,全外联全外联你比如说这个登录次数也好,或者是什么下单次数也好,加那购那个,呃,加购车次数也好,是不是都有可能出现闹啊,因为权爱连嘛,对不对,那全爱连咱们这儿如果是这种闹值,你说我就给他放闹这个合适吗?
43:09
其实不太合适,咱们给他放什么比较合适啊,对,放零比较合适,你今天没有没有登录,那就是登录次数是零,你今天没有这个加购车没有下单,那是不是就是零次啊,相当于然后金额就是零元对不对,那所以咱这儿呢,诶给他放到不合适,咱们做一个什么处理比较好呢?做一个什么处理比较好啊。判断比较好,如果为呢,那我就是零,如果不为呢,那我就是你这个自己的值是不是就可以了呀,所以在咱这用怎么做,用谁NVL不就行对吧,NVL就可以啊VL如果说那把谁放进来呀,应该是应该是拿谁拿那个loging count,其实loging count咱们这需要写别名吗。其实不用写,因为什么?因为其他的子查询当中是不是都没有log in count这个字段呀,所以你都没有是不是就不会出现歧义,你不写别名也行啊,那当然后边的得如果为no的话,你得给它改成零,没错吧,那接来下一个字段啊,该谁了?呃,该card count了,是不是也得是NVL啊,NVL那就是哎,Cut count啊,然后呢,也是零对吧?哎,没有加否就是零,哎,接着NVL,那这里边应该该谁了?该old,哎count了,那也是零对吧?那也是零,那最后一个啊,不是最后还有下一个啊,那NL该amount了,Older amount,哎,Amount这个字段,因为它是这种,是不是数字那个小数类型的呀,对吧?那咱们保持类型一致,这写谁0.0对吧?咱们写0.0啊,然后逗号,然后还有谁。
44:41
看谁该这个payment count了,那你就接着写呗,NVL啊,那这个应该是payy payment count逗号零,然后哎,NVL啊,然后payment amount逗号0.0 N点零,OK,那最后一个该谁了?该这个older detail了,对不对?诶,Order detail这个咱们想想它怎么处理啊。
45:06
他怎么处理?它是不是也有有全外联之后,它是不是也有可能为闹值啊,那他的闹咱们也给他转成零吗?那肯定不行,那这个是不是就不转就行啊,为闹你就是闹对不对,因为什么?因为你今天没有没有下单任何的商品,所以说我就是闹呗,这没错吧,那所以他呢,直接写谁就行,直接写那个older detail stas是不是就可以,是不是就可以为now呢?就就让它保留now呗,对吧,那所以说这就是咱们最终的这个词啊,搞定了啊就搞定了啊,那这个时候呢,咱们可以先哎执行一下,看他那个能不能用成功啊,看看有没有语法错误,哎,我们从上到下呢把它跑一下。来到这来直接来al enter,哎,不是ctrl enter啊,来ctrl enter让它直行,好,它在转圈圈啊转圈圈那那个没有报错,就说明语法是没问题的啊,看一下结果。
46:01
嗯。诶,这个结果已经出来了啊,你会发现啊,这是不是就是咱们想要的那种效果,你看这用户今天我登录了,但是呢,我没有没有加购物车,没有下单,没有支付,那是不是全是零啊,而不是闹对吧?啊,然后后边的没有没有那个下单就是闹呗,啊你看其他的啊往下翻啊,这个比较多啊,那你看这个地方啊,咱们这个用户呢,我今天你看这个就是属于哪种啊,这个属于。啊,属于他前一天对吧,啊是前一天登录的啊是这样的啊,然后后边呢,我们这儿呃,这个各种金额,然后各种统计啊就在这了啊是这样的啊,那这个咱们就相当于就完成了啊那最后呢,咱们是不是需要把这个数据呢,给它怎么样写到我们的,呃,哪张表里写到咱们这个DWDDWS层的user account里边,那这个insert往哪写,注意注意下啊,咱们这种语法insert往哪写?我是写在最前边,写在这个位置,还是写在这个select这个位置,写在哪,写在select这啊就跟普通的一样啊,还是insert加selectt,那就insert,然后呢,来一个allright加一个table DW X加一个user action de countt,然后边再来一个part part里边呢,咱们来一个DT等于2020杠零六杠幺四。
47:19
诶,那这个相当于就搞定了啊,就完事了啊,这就是呃,咱们这个完整的一个circle啊,完成一个circle啊,其实整整体逻辑不难,可能就是大家可能之前没有做过这种全外联多张表啊,那这个连接条件的,我们大家需要去注意一下啊,其他的就没有什么了啊好,那我把这个视频录一下。
我来说两句