00:00
好了,各位同学,那咱接下来要做的工作呢,就是这张表的数据装载了,呃,那数据装载呢,首先我们要明确的一点就是我们只需要写一个,然后呢,我们当前,呃,以哪一天的数据为例呢?咱们就就以14号的数据为例就行了,OK啊,那首先我们需要先干啥呢?各位先select一下,然后辅照嘛,对吧,Ods层的log INC这个就没什么可说的,比较简单,那之后呢,我们需要对它进行一个简单的过滤,2020杠零六杠幺四,那这样呀,我们就拿到了14号这一天的日志了,对吧?好,拿到之后大家都知道我们现在直接塞星拿到的是什么,是我们是不是所需要的是是我们这张面所有的日志啊,对吧,但是我们不需要所有的,我们只需要什么样来着。只需要页面日志对吧,也就是需要那种配置A配置不为空的这样的日志对不对?所以在这呢,我们应该再加一个规律条件,来一个and配置is from not now,对吧,这个没啥问题吧?好,那现在呢,我直接回车走。哎,你会发现啊,这个circle咱们执行完之后,它不对吧。
01:03
你看一看,我加上这个配置ID,一配置一闹闹这样的过滤条件了,对吧,但是它返回的数据呢,里边是不是仍然存在配置为闹的数据啊,对不对,这是怎么回事呢?是我刚才没执行吗?我们再执行一遍啊走你这页面还是这样。这是为什么呀?这个显然这是一个异常现象,对吧,这是一个异常现象啊,其实在这儿呢,我我就直接告诉大家就不卖关子了,这其实是什么呢?是have当中的一个未解决的一个bug啊,是这样的啊OK,那这个bug呢,我其实之前是有收藏的,然后呢,咱们去找一下给它打开啊来,我打开这个bug的那个那个那个界面啊,我找一下应该是在have当中,呃,之前我给他收藏过来,我给他拖到这。呃,这个里边呢,就是呃债务的一个这个各种因素,就是各种各样的这个问题,对不对,都会在这个呃地方展示出来,然后呢,你其实以后呢,可以在这里边搜索一些相应的解决方案等等等这些啊好完之后我们就呃先就事论事,咱们先只看咱们当前的这个呃这个bug来我们看一下,但实际上它的描述是什么呢?是这样的啊,是ru is not now。
02:13
什么意思呢?就是结构体不为空对不对?哎,那我们刚刚所写的这个物理条件是不是恰好就是一个结构体不为空,对不对?在这张表当中,咱去看一下,哎,我们的配置段是不是就是一个结构体啊,对吧?OK,结构体不为空,看它怎么样了,他说,哎,Gets evaluated as no always always怎么样呢?Causing in the query啥意思?就是说你去做一个结构体不为空的过滤的时候,对不对,OK,你仍然会得到什么样的值,仍然会得到这个空值对不对,完了之后呢,相相当于导致什么呢?是不是导致我们这个过滤条件是不是就在查询里边,就相当于失效了,丢失了呀,对不对,是不是这么一回事呢?其实这个确实是这样的,我们的现象是这样的,当然了在这儿了,我们诶可以再怎么样呢,比如说我执行一个这样的这个这个这个语句啊,叫做ex plan1plan是不是能够看咱们这个circle的一个执行计划,对吧,就是正常情况下,你这么去写一个S,你看它的执行计划里边会有一个什么,肯定会有一个filter了,对不对,那你现在直接回车,你看咱们这里边有filter吗?你找一找。
03:19
这个整个非常简单对不对,这是select operator,那下边有filterator嘛,根本就没有,对不对,诶是这样的啊,那完之后你假如我这的我换一个字段,那咱这里边是不是有一个这个比如说TSTS是一个big in类型的字段,对不对,OK,那我换一个,比如说我用它去过滤一下,我来一个意思对不对,完了之后,呃,应应该是TS啊tsts OK,那现在呢,我们再来看一下它的执行计划直接回撤,那它是什么样的,它跟刚才是不是有明显的区别,呃,这个我点错了啊,这是不是有一个filter operator,然后是tsis not now对吧?那显然我们这个结构体is not no,它是存在问题的,好,那这个问题存在,我们怎么去解决它呢?怎么去解决它呢?那实际上首先你要想知道怎么解决它,诶那在这儿呢,咱们就得知道导致这个问题的原因是什么,对吧?来我们可以看一看,就是目前这个bug的一个,呃,解决的情况啊呃,这儿有类型是bug对吧?完了之后呢,目前的状态是什么状态,是result的已经解决了,对不对,但是它是在哪个版本解决的呢?是在fix修复的版本,是在4.0才修复的,也是我们现在用的这个3.1.2呢,它确实还是存在这个bug的,在3.1.2版本是没有解决的,OK啊好,那完之后我们来分析分析这个问题到底是怎么去,呃,这个出现的,我们到底应该怎么解决,首先这个问题的根本原因其实是由它导致的。
04:39
由CBO导致的这个CPU大家可能之前并没有听说过啊,呃,CPU呢,它实际上呢,是我们很多这种数据库都有的一个这个数据库的优化方案,CBO它指来的是什么呢?是这个啊,C指的是cost,然后B呢指的是best,这个O呢指的是呃,Optimize就是那个优化那个单词是这样的啊,也就是说这个东西连起来应该叫做什么呢?
05:07
Cost啊叫做开销对不对,Cost,然后贝斯是不是就是基于什么呀,对吧,然后后边这个O指的就是优化对吧,也就是基于性能开销的优化策略。啊,是这样的,OK,什么叫做基于开销的优化策略呢?是这样的啊,就是说OK,那比如说举个例子,我这儿呢,有一条SQL语句对不对,那我这个SQL语句最终最终在have当中肯定会转成一个什么具体的执行任务,对吧,是一个买,呃,这个Spark的任务也好,是一个micro也好,对不对,它最终是会转成这样的计算任务的,OK,好,那我这个所谓的基于开销那是啥意思呢?就是说我会实际的去分析你这个任务将来会用到的资源。那是这样的啊,你会用多少CPU,你会用到在多少这个这个内存等等等等,OK,我会去分析你这个任务用到的这些东西,然后呢,我会选择一种就是你的开销,也就是你使用的CP,你使用的这个内存最少的一种方案去执行这个计算任务,因为一个circle,我最终的这个计算任务是不是可能会有很多种方案呀,对吧?啊,可能会很多方案,然后呢,我会基于它的开销挑选一个最小的方案去进行这个执行,这就是所谓的CBO的一个,呃,这个概念玩的在这儿呢,可能直接这么说大家,呃,这个不好,不好理解,然后给大家举一个具体的CBO优化的案例啊,比如说咱们这举一个这样的例子。
06:28
假如我这样的有这样的几个表需要进行join,就是咱们写了一个circle,需要对表进行照,对不对?然后呢,我有这样的几张表,有这样三张表,这是第一张表叫做A表,这是一个大表,那完之后呢,我有一个跟他差不多一样大的表,叫做B表,完之后呢,我还有一个小表,叫做C表。OK,好,这是一个小表,完之后大家来想一想,你说我这三张表要进行join操作的话啊,然后我做的是inner join,是inner join啊,OK,好,问一下大家,你做inner join,你说我们这仨表join之后的结果跟我这个表的招顺序有没有关系?
07:05
有没有关系?用inner照啊,Inner照我这表的照顺序和我这个最终的结果有没有关系?没有任何关系,因为你要做的是inner,照inner最终是不是会返回这三个表共有的部分呀,对吧?所以说谁跟谁先照或者谁后照,对结果没有任何影响,能理解吧,对不对?但是你要琢磨琢磨,我这个不同的招顺序,我的计算开销是一样的吗?是不一样的,这个显然是不一样的,对吧?比如举个例子啊,假如说我现在呢,让A跟B先进行招,对不对,这相当是一个大表照N大表对吧?然后你得到的结果是不是仍然是一个大表啊,对吧?然后我再跟C进行招,对个C是一个小表,这是一个大表跟一个小表对吧?相当于我这三张表要做照样的话呢,我相当于是有一次大表跟大表的照,有一次大表跟小表的,这没问题吧?好,那完之后,假如我们现在换一个顺序,我现在呢,我先让A跟C。对不对,A跟C先照,那它俩照完之后,这变成了一个什么呢?是不是一个大表跟一个小表照,那我因为是用的in的照,我得到的结果是一个什么,相当于一个小表对不对?好,那完之后我再用它去跟,当然跟第三张表照的时候,我们大家都知道,实际上是用前两张班照的,结果跟第三张表照唤对吧?好,那现在呢,我相当于是一个什么小表跟一个大表进行照的。
08:19
没没没问题吧,OK,好,那就是我这么去照它的话呢,是相当于是两个是不是大表照小表,相当于是一次大表跟小表,一次小大表跟小表,那你大表跟小表在还当中,我们正常情况下你可以做一个什么样的优化,是不是map join啊对吧,是是这样的吧,OK,那所以说从这通过这个案例我们就能够看出来啊虽然我这个呃同一条S对吧,呃,那我这个有不同的这个执行计划,我得到的结果是一样的,但是呢,我不同的这个专案顺序,我不同的计这个执行计划,我的开销肯定是不一样的,能理解吧,OK,那这个所谓的CBO就是什么意思呢?啊,就是保证你这个结果是前呃相同的这个前提下,对不对,我选择一个这个开销最小的一种方案去进行这个运算啊,这就是所谓的c bou的一个原理,当然在这儿我只举的只是一个具体的案例啊,呃,这个CPU它的这个优化策略还还有很多啊,这个咱们简单了解一下就行了,然后这儿之所以出了一个问题呢,实际上是have的CBO优化当中的一个bug啊,这样的就是C。
09:19
优化之后就会导致这样的一个过滤条件失效啊OK好,那所以说我们在解决这个问题的思路呢,有两个,那一个思路是什么呢。一个思路是什么呢?首先第一点它是不是什么,只有用结构体过滤的时候会出现,哎这个问题对不对,那我可以换一个思路,我不用结构体过滤的,我用什么过滤呢?我用结构体里边的一个具体的字段去过滤,行不行呢?来咱们点一下,比如说我来一个配置下游下ID里边应该是有一个配置ID的,对吧?好,那现在呢,我执行一下这个一啊看一下执行一下直接回车,诶你看这个过滤条件有没有出现,诶这个有没有出现。出现了对吧,这是不是feel,呃,这个filter operator已经出现了呀,对吧?那所以说我不用结构体过滤,我用结构体里边的一个字段过滤,那那这个问题咱就能解决,这是一种思路,那当然还有另外一种思路,你还可以怎么做呢?
10:09
这个c bou优化呢,实际上是能关的,你可以不用c bou优化,对不对?OK,那怎么关呢?这其实是有一个参数的,大家来看这是不是有一个set,这个have.c Bo able,这默认是等于对吧?我们是不是可以给它置为false对不对?那接下来呢,我们来测一下这个方案能不能行啊,那首先我需要先给它是不是置为f file SE啊对吧?哎,设为false,设为false之后呢,下边这块我就给它,是不是给它去掉那就完事了呀,对吧?去掉之后,呃,当然我得去后边。去注意我现在是不是又用结构体去过滤了,对不对,好,那现在呢,我们来把这个呃,给它执行一下,先把这个参数执行,那之后呢,我们再把下边的这个给它执行一下,走注意观察,你看有没有那个过滤条件。有吧,配置一字闹闹是不是已经出现了,对吧,那你只要把CPU关掉,那我这个过滤条件也能够正确的出来,OK,那就是这样的两种解决方案,这一点大家要理解一下啊,其实这里边还有另外一种解决方案,就是怎么做呢?是不是人家这个版本4.0是不是已经解决了。
11:09
没没问题吧,那我们可以参照什么呢?也就是说如果你能升级版本,那升版本最好对不对?你要是升不了版本,那怎么办呢?这时候呢,你可以参考就是4.0这个版本的解决方案,对吧?去把3.1.2的源码下载下来,下来之后呢,照着那边去把这个3.1.2的改一改,完了之后呢,也能解决这个问题,就当然你得重新编译源码,是这样的啊呃,当然这个大家可能觉得做起来是不是有点难度啊,对吧?呃,确实有一定难度,但其实我之前给大家发过一个编译汉语源码的视频啊,大家还记得吧?呃,编译have,不知道那个视频大家有有有看过的东西吗?有看了,呃,有同学看了啊,就是那个里边我是不是就已经解决了一个have的,呃,另外的一个bug呀,对吧,诶那个bug的解决思路就是这样的,我是参考了一下,就是高版本的那个解决思路,然后呢,改了一下3.13.21.1.2的一个源码,改了之后呢,那重新编译,那就把那个问题给解决了,是这样的啊,那大家要是有时间的话,可以看一看那块是怎么操作的,其实相对也比较简单啊OK,那这个呢,咱们就不再多说了啊好了,在这呢,我们。
12:09
就不去这么麻烦了,不去改源码了,那在这我们就怎么做就行了呢,我们就随便采用一个方案,你用那个呃,具体的字段去过滤也行,或者说你把这个C给它关了也行,当然啊,要是我们采用关闭CBO优化的这种策略。你不要不要去设置一个全局的参数,不要说把这个参数直接放在还有赛当中,那这样不太好,为啥呀,因为只有是不是这种情况下CBO它才是有问题啊,对吧?但是在大多数情况下,CU优化它是不是有用的呀,对不对,那所以说这个东西不要全局关,也就是说你只在执行这个的时候给它关了就行了,诶这一点要大家注意,大家一定要注意一下啊,那那咱这儿呢,就说这么多啊好了,那截止到现在呢,我们就已经完成了我们现在的第一个小目标了,我们刚刚只是怎么样从这张表当中拿到了啥呀。拿到了我们所需的这个页面浏览日志吧,对吧?那现在我们把这个ex plan给它去掉,然后呢?诶,我们执行一下这个词吧,咱只是刚刚拿到了页面浏览日志,那接下来咱要做的工作应该是什么呢?咱是不是得解析这个日志,得拿到上述咱们所需的每个字段呀,对吧?那前面就提到过,这里边绝大多数字咱们都可以直接从日志里边取,对吧?比如说咱这随便取几个啊,那OK,比如说我先取第一个prod,那第一个就取不出来是吧?取出来的话,那咱们可以取谁啊?取那个AR,将来再做join是不是就行了,对吧?所以在这儿我们取一个common.ar那是不是就拿到了我们想要的第一个字段的相当于对不对?那比如说第二个字段,那我就再来一个common点,比如说BA,那是不是那个品牌也就拿到了对吧,等等等等,当然。
13:39
我们不是所有的字段都位于呃这个common里边的,是不是有一些是位于配置里边来,对吧?比如举个例子,那里边配置ID我是不是来自于配置啊对不对,OK,在这儿呢,你就可以来一个common点,比如说这个PA,呃,应该是配置啊配置配置哎,你就来一个配置点,然后呢,配置呃,这个下下ID对不对,你需要啥你就去获取,是不是就完事儿了,对吧?绝大多数资咱们都可以通过这样的方式得到,OK,那这里边唯一只有谁拿不到呢?
14:05
Session ID达不到OK,那所以咱们接下来呢,就重点分析分析这个session ID我们应该如何处理好,那现在呢,为了方便大家去呃理解这个所谓的绘画的概念啊,那在这儿呢,我先去从这张表当中选几个关键的字段出来,其实这张表当中咱们要选关键字的话,你应该选什么呀,其实是不是就是选是谁对不对,在什么时候浏览了什么页面,是不是选这些字段就OK了,对吧?这就是一条页面浏览记录的关键字段,其他都是一些维度属性,我们暂时先不选,选多了大家看着乱啊,OK,我先选这几个关键词,首先是谁谁是不是应该是来自于common当中那个mid啊,对吧,咱们用它去标识人,好,接下来就是谁在呃什么时间浏览什么页面,对吧?那先拿页面,这里边应该是有一个配置点,是不是配置ID啊,对吧,我们顺带着把它上页ID拿出来。诶,Last配置ID,哎,这是上页的啊,那当然了,还有一个就是当前的页面ID也是配置ID对吧,然后我们再拿一个,拿一个谁呢,就是那个时间对不对,这样一来我是不是就知道是谁在什么时候浏览了什么页面了呀,对吧,咱把这几个关键的字段先给他查出来走。
15:10
好了,那这个字段咱们就已经查出来了,好了,查出来之后呢,我们大家都知道最终最终我们需要干啥呢?是不是在后边自己给它加上一个字段,这个字段是咱自己加工出来的,对吧?就是那个所谓的session ID,绘画ID,好那大家都知道绘画ID在这儿的作用是什么呢?是什么呀。是标识我们这些所谓的页面浏览记录,我现在这一行是不是就是一个页面浏览记录啊,对吧?哎,你去标识这个页面浏览记录,它是属于哪一个绘画的。没问题吧,OK,好,那现在呢,我们来看一看啊,就是其实我们从这个目前的这个数据当中,大致也能看出来,我们这些哪些这个页面浏览记录是属于统一绘画的啊,你比如举个例子,咱们看这你仔细观察一下,你应该能够发现这些页面浏览记录就应当是位于同一个绘画的,这个咱们怎么能看出来呢?首先你看它前面的mid是不是相同的,相同就意味着啥,他们是不是同一个访客呀,对吧?那接下来往下走,你再看后边的这个时间,它正好是不是从前到后就是有序的呀,对吧,这个咱们去恰好是有序的啊,当然没续的话,你可以给他排个序好,那完之后呢,你再看我们这个页面的调整关系,你看首先这个位置有一个last配置ID等于no,诶last配置A等于now,这个意味着什么,各位同学。
16:25
意味着什么?意味着当前这个页面浏览记录啊,它应该是什么?是一个绘画的起始页面,没没问题吧,OK啊,因为我当前没有上一个页面页面嘛,对吧,那我就是第一个页面面对吧,这是当前绘画的起始页面啊,OK,好,完之呢,由now是不是跳到了后面,这是咱们这个绘画浏览第一个页面了,对不对?之后呢,你看home是不是跳到了search search到good list good list到good,它上下是不是有这个明显的跳转关系啊,对吧?所以从这我们应该能看出来,这其实就是一个所谓的绘画,OK,好,那我们这儿加的这个所谓的绘画ID,我们得保证什么呢?你得保证你这同一个绘画的所有的页面聊览记录在这儿,你加上的这个值得是什么样的才行。
17:10
得是一样的吧,是个道理吧,是不是你得保证这几个页面浏览记录,我加的这个30ID是相同的,才能表示它们是属于同一个绘画的呀,对吧?而且你还得保证另外一点,就是说你这个页面,这些页面聊览记录,你加的绘画ID,你跟另外的这些页面聊览记录你不能是一样的,对不对,一样的是不是就混在一块儿了呀,对吧,是这样的,OK,那也就是说一句话,就是咱们得保证我们家的这个绘画ID得准确的将属于同一个绘画的这个页面段记录给它标识出来才可以。哎,是这样的,这就是我们加这个绘画ID要做的具体的工作,好,那现在问题来了,那咱们这个绘画ID我们到底应该怎么加呢?先不用考虑这个circle怎么写,咱们先来设计一下这个绘画ID对吧,这个绘画的,因为它原来没东西,是咱们从零开始设计对不对,OK,那大家想想,你说我这个绘画ID我可以怎么设计啊,就是说我这个会ID我到底由什么组成对不对?来分析分析,也是它里边的值到底是什么。
18:07
嗯,可以分析分析。呃,大家应该想到了,首先有一个就是mid对吧?但是光有mid肯定是不行的,你要是只有mid,他可能会有一个什么问题啊,一个人我可能有俩绘画对吧?你这俩绘画是不是m mid都相同对不对,那这样一该是不是这俩绘画你就分一起来对吧?这肯定是不行的,对吧?他光有mid不行,但是呢,它可以作为咱们的一部分对不对?哎,我可以再来另一部分,另一部分加什么呢?呃,我刚才有听提听友们提到了可以用什么用时间对不对,那用哪个时间呢?你看啊,我这一个绘画当中,我有这么多的时间,对不对,那那我用谁用哪个时间呢?拉配微空,也就是说白了就是啥呀,就是我们这个绘画的相当是一个起始时间,对不对,你用起始时间那作为一个标识,首先这个能不能实现我们刚刚所提到的那个那个效果,什么效果呀,你得保证你这个绘画ID得能够唯一的表示一个绘画才行,对不对?好,那我加上它能不能实现这个效果呢?能,其实是显然是可以的,为什么?首先第一点你相当于是两部分组成嘛,第一部分是mid,有了mid你能够把什么样的绘画区分开。
19:11
能把不同人的不同绘画区分开对不对?好,那我再加上一个绘画的起始时间,能把什么区分开?能把同一个人的不同的绘画区分开对不对?那这样一来,我的绘画ID不就能够唯一的表示一个绘画了吗?对不对?首先这个方案告诉大家是可行的啊,可行的OK,那现在呢,就定一下这个方案啊,当然这个并不是唯一的方案。并不是唯一的方案,OK,这只是一个可行的方案,OK啊行,那咱们现在先把这个方案明确一下啊呃,两这个绘画ID呢,两部分组成,一部分就是midd,那另一部分呢,就是那个会画的起始时间,所谓的起始时间是不是就是上页ID为空的那个页面浏览记录所对应的TS,对吧?就这个意思啊好了,那完之后我们这个明确下来之后呢,我们来分析分析,就是将来咱们怎么去拿到这样的这个绘画ID。怎么拿到它两部分啊,首先第一部分其实好拿,第一部分是不是每个页面浏览记录,我前面都有一个现成的midd,这个是不是直接拿过来就完事了,对吧?这个好拿,关键是这个时间咱们怎么拿。
20:11
大家要注意啊,这个时间呢,拿的是什么啊,你得这么拿才行,你注意这是不是属于同一个绘画的对吧?OK,那这是咱们那个起始时间对吧?那我第一个把这个英文聊记录,OK,我后边这个绘画ID当中的时间你取这个,那第二个呢。也得取这个吧,是不是都得取这个开始的时间,对吧,你得把它也得拿到这儿,诶把它也得拿到这儿,等等等等,你是说这一个绘画当中所有的页面来记录,你都要去拿第一个页面的那个时间啊,对吧?哎,你得给他一个一个的都拿下来才行。哎,这是咱们的一个方案啊,怎么去拿它。怎样能把第一行的时间拿到我下边的每一行?怎么去拿,诶这个涉及到什么操作,涉及到跨行的操作了,对吧?其实一般情况下,咱们只要涉及到,比如说我需要把当前行的数据跟比如说其他的行的数据去做一个比较啊,或者去做一个其他的操作等等的,只要涉及到跨行的操作了,都应该用到开窗,对吧?这会儿大家得有这样一个意识啊,所以显然咱这也应该用到开窗,那我们用哪个开窗焊窗呢?
21:18
呃,这个看重L函数,大家可能之前是没学过的,可能没学过啊,所以咱接下来呢,我就给大家一点提示,我就告诉大家我们到底应该用哪个开重L函数啊,是这样的,好,那我们到底用哪个呢?那现在呢,我们打开这个have的这个官网,咱们去找一下啊呃,那实际上呢,我们have的官网上呢,有我们就是写三的时候需要用到的各种各样的信息,对吧?所以大家呢,得善用这个官网啊,那咱们去去去进到哪啊,是不是函数long个位置be啊对吧?来进来进来之后呢,我们现在要找的是A是函数对不对,那之前咱们找函数是不是都找这个啊对吧,但这次咱不能找这这其实里边放的是一些普通的函数,那在这呢,我们找谁呢?找下边这个windowdling and是不是analytics function啊,对吧?是不是开窗和分析函数啊,对吧?那我们应该点这个,这是咱们的开窗函数,它的介绍文档,好,那现在呢,我们往下翻,呃,这回咱们找谁啊?来,先简单的熟悉熟悉这个界面,这里边有什么?Lead like first value last value这些东西大家还有印象吗?Lead like应该还记得吧,对不对?这是不是可以获取什么?
22:18
上边几行的数据,这个是获取什么?下边几行,呃,这个是上面几行,这个是下面几行啊,Like是往上立的,是往下滑对不对啊,这个要注意啊,这两行数大家应该是学过的,但是下面这俩学没学过。First value last,这个应该没学过啊,OK,那完了之后呢,其实我们现在要用的函数就是。这两个其中之一。但是用哪个我不告诉大家,给大家一点思考空间啊,好,那接下来呢,我们就把这俩函数呢,给他熟悉熟悉啊,看一看就是这俩函数我们到底应该怎么去用啊,那首先我们现在先看第一个函数叫做first value啊,其实俩一块看也没事啊,那首先我先明确一下吧,就是这俩函数它们的作用应该是什么啊,First和last是不是就是取第一个值和取最后一个值啊,对吧?好,那它取的是什么呢?实际上它取的是注意它是一个开窗函数对吧,它取的是窗口内。
23:08
某一列的就是第一个值,或者是最后一个值,First就举第一个,那last呢就举最后一个,哎,这个怎么理解呢?比如说咱这举个具体的例子啊,假如说这就是窗口内某一列的所有的值,假如说这呢有一个一,有一个二,有一个三,有一个四,对不对,OK,好,那么这first y6,那我取的就是1LAST y列呢,取的就是四,就是这个意思。好了,那下来我们继续往下看啊,下面看一看这两函数它具体用法是什么,先看第一个。第一个是什么?他说这个函数最多接收两个参数,对吧?OK,那这俩参数分别是什么呢?往后看,他说the first value,呃,The first,它什么意也是第一个参数,对吧?是什么?Is the column for which you want the first value啥意思?说白了,第一个字段第第一个的第一个参数就是一个什吧,就是一个列名,对吧,对吧?因为我们刚才说了,它获取的是窗口内某一列的第一个值,对吧?那到底要哪个列呢?咱是不是得告诉他一声啊,对吧?哎,这就是第一个参数,好,那第二个参数什么呢?往后看,他说the second,注意观察是optional什么意思?
24:10
是不可选的呀,对吧,第二参数可传可不传对不对?好,那接下来往看这个第二参数到底是啥,然后往下走,他说第二个参数呢,必须得是一个孤尔类型的值,默认值是什么呢?是false,诶那如果设为true,它会怎么样呢?If set to true it是不是skips now values啊,对吧?是不是就会跳过now值啊,对吧?啥意思啊,比如说我这个窗口内这一列的值是这样的啊,第一个值是no,第二个呢是一,第二是三,呃,然后是这个123啊,然后四最后的是no,对不对?这是窗口内这一列的值,好,那现在如果我们使用first value去获取这第一个值的时候啊,第二参数如果我用的是默认值false,那它会怎么做呢?会返回谁?闹值他不跳闹对吧,那如果我第二参数设为触了,他是不是就会跳过闹值了对吧?跳过闹值那就取谁啊,那就取一,那如果我第二个数也是闹呢。
25:04
它继续跳对吧,直到找到第一个不为闹的值为止,哎,能理解吧,哎,这就是咱们这个第一个参数和第二个参数的一个作用,好了,那first value6其实是这么用,那last value6呢,跟它是一样的道理,只不过呢,它是从下往上找对不对,这个呢,咱们就不再多说了,这就是first value和last value这两个函数的一个基本说明,当然我知道大家这个开数函数用的不是特别的熟,就是根据我刚才的这个描述,我描述完之后呢,大家很有可能还是不知道现场函数怎么用,对吧?那所以说咱们接下来呢,花一点点时间。哎,去给大家说一下这俩函数具体它的执行逻辑是什么样的,完了顺带着给大家复习一下我们这个开数函数的知识点啊好,那现在呢,咱们简单的看一个小例子啊来,我打开一个这个lime来告诉同学这块咱们认真听啊,那首先呢,我们需要先干啥呢?我先构造一个虚拟的小表啊,这个小表呢,咱们就随便来,比如在这儿呢,我首先我来一个字段啊,叫做比如说midd吧啊后边呢,比如说我来一个配置下划线ID啊,然后呢,我后边呢再来一个,随便来一个,比如来一个TSOK,我就随便来这样的几个字段啊好,那之后呢,我们往下走。
26:10
呃,往下走,那假如说呢,我这儿呢,这个m midd我随便来来点东西啊,比如都叫101,然后后边往后走,那这个呃配置ID呢,比如说我在这儿呢,会有这个呃A,哎,有B,呃,我我构造几个闹值吧,构造几个闹值啊来一个闹吧,那第二一个是A,然后下面呢是哎B,然后再往下呢是C,然后再往下呢D,然后呢E,最后一个咱也给他来一个闹纸,诶也来一个闹OK,那接下来我们再继续往后看,那再往后呢,是不是就一个所谓的TS对吧?啊这个TS也是随便来,比如我们就给他来一个一呃这个这个往后推这个来一个这个呃二对吧,这个我复制一下吧,要不然的话不好弄啊,那走这个走啊这个走这个走。好,然后呢,下边我们给它依次排好序啊,这个就叫一,这个就叫呃,相当是二呃二呃三对吧?然后呢,这个是四,这个是五,这个是六,那这个呢,咱们来一个七没问题吧,好,那这就是我这构造出来的一个小表,OK好,构造出来之后咱继续往下看啊下边假如说我们就需要去使用谁呢?使用first y6对不对,去获取比如说配置ID这个字段的第一个值对不对,你看这块我们这个应该怎么去写啊,正常写的话,你这是不是得这么写,得写一个first fire SD,然后呢,Value对不对?Y里边是不是得传参数啊对吧?那它是不是首先你得传一个啥呢?配置ID对吧?你想获取哪个列的第一个值是不是就全哪个字段就行了,对吧?那配置ID好,那第二参数呢?呃,咱们大家知道它什么含义,默认是是false对吧,False是不跳过now值,比如说我现在不传,我就是先不跳闹对不对?好,继续往下走,后边咱们得写上。
27:42
是不是正常的写over啊对吧,那over这边呢,咱们,呃里边正常情况下是写什么内容啊。是写part提BY,写order by对不对?当然还可以指定什么东西来着,还可以是不是指定那个窗口范围啊,对吧?大家还记不记得这个窗口范围的概念对不对,是不是什么Rose between啊,能理解吧,什么什么前面多少行,后边多少行,是不是那个东西啊,对吧?OK,那是咱们指定窗口范围的语句,当然指定窗口范围的语句我们能不能省略,就是说我可以可以,可不可以不写,可以不写,那不写的话,我的窗口范围,那默认是什么呢?默认其实分两种情况。
28:19
分哪两种情况呢?就是有order外和没有order外,就这个应该大家还记得吧,对吧?有order外的话,那我默认的窗口范围是什么?是第一行到当前行对不对?这是有order by的情况下,那没有order by呢?是窗口内第一行到最后一行,这叫没有order by对不对?是这样的,OK,好,那接下来呢,咱们就不写那个自定义的窗语句了啊,然后之后呢,我们只写一个part,只写一个O啊,比如说我们part by PI part,那咱们拜谁呢?T ion啊,那拜谁?咱这呢就拜一个mid,然后大家注意观察,我这的mid是不是都相同,他们是不是就会位于同一个塔尔基真里边啊,对吧,好,那就来继续法走,那下边我这先带着外啊有那我拜谁呢?
29:02
我就把TS大家注意观察,我这个TS是不是恰好就是有序的,没问题吧,OK,那也就是我们现在看到的数据,是不是正好就是我们这儿要处理的一个格式啊,对吧,就是这样的,OK,好,那接下来咱们继续拿走,那既然我这儿有orderby,那我的窗口范围那就是什么。那就是第一行到单一行对不对?好,那现在问题来了,我们把这个函数加在这个数据上之后,我们这得到的结果应该分别是什么?对不对,你要能知道结果是什么,那就证明大家对这个函数真正的理解了,对不对?来分析分析吧,这个结果应该是什么呀?来,我把这个往后走啊,走走走走走分析分析吧。首先我们看第一行这块应该是一个什么值。这个开窗怎么分析,咱们得知道这个开窗怎么执行开窗函数,它在执行的是不是也是一行一行的往下走啊,对吧?比如说举例子,我们现在先看第一行,那第一行那刚才咱们说过它的窗口范围是什么来着?有order y啊有Y是啥意思?是第一行到当前行对不对?是不是就是位于我们这个分区内的第一行到当前行对不对?当然得是排好序的,咱们现在是恰好就是有序对吧?恰好有序,我第一行到一行不就只有这一行吗?对不对,只有这一行我去取first value,我有的选吗?没的选项只有一个now对不对?那所以说那第一行这肯定是闹没问题吧。好,接下来看第二行,你到第二行的时候,那咱们的窗口范围是什么?
30:23
还是第一行到这一行啊,对不对,第一行到那行,那就是啥是不是就是前两行啊,咱这是不是就排好序的呀,对吧?哎,前两行,那前两行我要取第一个值,而且我也不跳闹,那我反回来就是,那就是闹呗,这个没得说吧,对吧?OK,继续往下的,那第三个呢,一样的道理啊,对吧,第一行那单那行取第一个,那是不是还是闹对不对,这个还是闹啊,这个没啥问题,那接下来继续啊,那这个呢,还是闹呗,对吧,那再往下是不是都是闹啊对吧,这个我就不再一个一个说了啊,都是闹,OK,那这是我们first value它的第一个使用场景。好,那接下来我们继续往下加大一点难度,那现在呢,我把这儿呢,给它加上一个处处,是不是会跳过闹值啊,对吧?好,那现在来分析分析,那你说我们这儿的结果应该分别是什么,我把这个呢,该删的都删了啊,先看第一行。
31:09
第一行还是那个规矩对吧,第一行到单间行只有一行对不对,我们取first y6是不是只有这一个值,只有这一个值我不管跳不跳,我我没得选对不对,所以说那肯定只只能是闹了对吧,你就是即便要跳我没得选呀,对吧,再往下跳没东西了对不对,那肯定也会返回到了这个理解一下啊来继续往下走,我们看第二一行,第二行,那咱们的第一行到当前行选一个不为闹的值,那选谁?选第一个不为闹的,这是不是他是闹会跳过呀,对吧,那是不是肯定是A呀,对吧?好,那这个没得说,那这个呢。你看啊,是不是前三行第一个不为道的时候还是A对吧,还是A,那这个呢还是A,这个呢还是A,这个还是这还是A,是不是都是A呀,对吧?诶,那这样一来first value大家应该就知道它怎么用了,诶这是first value啊,那接下来呢,我们再继续往下走,我们看诶换一个换last value,那如果我这儿呢是last value,那这个东西它又应该是怎么玩了呢?来,咱们逐个的来过一下啊,我把这个该删的先全部删除来,首先我们看第一行,注意第一行我这是带处的啊,是带处的。
32:10
啊,大叔会跳闹对不对?OK,那第一行我应该取什么来着,是不是最后一个部位闹的对吧,但是你没得选,你只有一个值对吧,那就是闹位,OK,那接下来继续往下走,下一个。这样一个选手。呃,应该选A吧,对不对,应该选A啊,那下面那个呢。B吧,对吧,窗口内嘛,最后一个是不是B啊对吧,然后呢,往下走C对不对,这个应该是D这个呢,应该是E这个呢。E吧,对不对,因为我会跳闹嘛,对吧,因为这个你大家看啊,我这个是第一行到当前法,是不是所有的数据啊,对吧,最后一个不会闹的闹会跳过,最后一个不会闹是不是E啊对吧?诶那就是E是这样的一个逻辑啊,所以这块呢,大家得搞清楚咱们这个last value它的一个工作的原理,以及first value的一个工作原理啊好,那当然了,我把这个处去掉,哎,这个默认就是false了,对吧,那他这返回什么结果,大家能能能一下答出来不?
33:00
这法结果应该是什么?第一个是不是肯定还是返回到啊,对不对,这个还是abcd对不对,只有哪不一样,只有最后一个不一样,它会返回到对吧,没问题吧,好了,那first value和last value这两个函数我就都给大家给演示了一遍了,然后我需要告诉大家的是什么呢?就是我们这儿去加上这个所谓的绘画ad的时候,对吧?咱们其中有一个步骤是不是获取每一行的这个TS对吧?那第一行的这个TS对吧?OK,那其实我们就会用到刚刚我们所讲的这两个函数之一,一个是first y6,一个是last y6,其实大家可以琢磨琢磨,你说咱这儿要用的话可以用谁。大家都想到了用first y6对吧,First y6是不是可以取我这个第一行的这个数据啊,对不对,没问题吧?好,那咱们接下来就来看一看这个first y6能不能行啊来我们先试一试,也说在这儿呢,我正常我我需要怎么做,我是不是需要加上一个开始函数啊,对吧?比如说我来一个first的Y6,那之后里边咱传啥。传,呃,TS对不对,OK,那要不要跳闹呢?跳不跳其实无所谓,咱这有闹吗?这个TS没闹对不对?没闹的话,其实你跳不跳都都都都是一样的,对不对,OK,那咱们就不用管它了,尽量往后走,后边是不是得写over对吧?Over里边是不是得写part by得写over by对不对?好,那part by咱们拜谁?
34:17
那在这咱们拜谁呀?呃,大家能想到的应该是by mid吧,对不对,好,那我们先尝试着by mid试一下啊,来mid啊那玩呃,这个当然你得写什么呢?你得写common点是不是mid啊对吧?哎点然后OK,那接下来我们继续,后边是不是还得有一个O点呗,那O。应该拜这个时间吧,你那不得按照时间排序才行,没问题吧,OK,好,Order by这个TS好了,那完成之后我们相当于就已经把这个开通函数写上了,那写上之后呢,我们相当于是不是就应该能拿到我们呃,绘画起始的那个时间了,对吧?来,到底结果怎么样,我们查一下看一下啊,来,我查一下。稍微等一下啊。
35:00
呃,因为这个呢,需要去走这个计算引擎啊,来结果已经出来了,这是咱们那个开关函数得到的结果对不对,然后呢,咱们稍微再看一眼啊,这应当是我们刚刚所说的一个绘画对不对?然后呢,这个是我们后边加上的那个时间戳,你注意观察,这些时间戳都等于谁都是幺幺对不对,那是不是跟我们这个绘画的起始时间是一样的。好像咱现在已经实现我们想要那个效果了啊,然后我要想稍微等一下,我要想得到最终的mid,我只要怎么样就行,理论上把这个mid跟这个时间是不是给他慷慨了一下就完事了,对吧,理论好像就行了,但是这样真的行吗?对,有没已经意识到这个问题了,这个显然是有问题的。大家想想什么情况下会出现问自己思考思考啊,什么情况下会出问题,目前看着确实是OK的啊。啊对,有同学已经说出正确答案了,其他同学再想一想看能不能想到,再想一想,可能有同学没听清啊,不要笑啊,什么时候会有问题啊,我再重复一下刚才同学所说的啊,实际上呢,是在同一个人或同一个访客,他在一天里边啊,它有两个或以上的这个访客,这个绘画的时候,这个就会出问题了。
36:10
为什么会出问题呢?咱们琢磨琢磨啊,就是假定我们现在看到的这应该是俩绘画吧,这是一个绘画对不对,这也是一个绘画对不对?应该能看出来对吧?OK,假定这俩绘画就是同一个人的,当然了,同一个人的绘画,他的访客ID应该是相m mid应该是相等的,对吧?但我们这不一样,我们假定他是一样的啊,这就是一个人的两个绘画相当于是啊,OK,我把它圈起来好了,那刚才呢,我们再去加这个开窗函数的时候,我们盘其真带是按谁分的,是按照mid分的,对吧?那也就是说这俩要是相同的话,是不是会分到同一个排基人里边对不对?Order派我们是按照什么呢?是按照时间,假定这个时间从前到后就是有序的,OK,好,那完之后呢,我们看一看,你这么去加的话,这个first value会出现什么问题,首先我们一行一行来先看第一行,第一行的时候,因为我们有order y,所以说窗口范围是第一行到当前行对不对?都说只有这一行,你拿TS这个没有任何问题,好,那接下来继续往下走,我们到第二行,第二行的时候呢,我们仍然是第一行到当前行取第一个,这个也没问题,没,没错吧,咱一直。
37:10
直走走走,一直走到哪都是没问题的呢,你到这儿到这个,这是我们第一个绘画的最后一个页面,对吧?你到这儿的时候,你取first位都是没问题的,都是正确的,但是你到了第就是下边一行,下边一行是不是进入到一个新的绘画了,对吧?你到新的绘画的时候,你的第一行到那一行是谁?是你这个分区内的是不是第一行到达一行对不对,你是不是会把第一个会画也给带上,对吧?这时候你取first y流,你其实取的仍然是第一个绘画的第一个页面的时间,也就是你这个时间跟这儿也是一样的,好,那这样一来加了半天,你相当于是不是这两个绘画我的这个时间都是一样的,对吧?那这样一来,是不是这一个人的两个绘画你就混一起就区分不开了呀,对吧,所以说在这儿用first value6是不行的啊,是不行的啊,那既然不行,那没得选,那只能用谁呀,那last value了,对吧?那last value6怎样能得到我们想要的那个结果呢?
38:02
怎样能得到想要的那个结果呢?其实这个说实话有点难度啊,来视频我先停一下啊。呃,来吧,各位同学,那咱接下来呢,就一起来分析一下,就是我到底怎样去获取我们想要的那个绘画ID,那刚才提到了,在这呢,我们用first value肯定是不行的,我们得用另外一个函数,可以用last value OK,那用last value流这个怎么实现呢?那首先在这儿呢,我需要先去构造一个字段,大家来看我构造的这个字段是什么样的啊,我来一个if if是做判断呀,对吧,那我判断什么呢?我判断这个配置点last配置ID,然后呢是是否为空,如果它为空对不对?OK,那为空那就意味着什么?围空意味着这是不是一个绘画的起点呀,对吧?OK,那这时候我就给他返回一个TS,呃,稍微注意一下啊,雷词跑哪去了啊,把这个关掉啊,哎,我就返回一个TS,否则呢,否则我就返回一个no,哎,那家想想如我这个结果得到的这个数据应该是什么样的?
39:02
我这回得到结果应该什么样的?哎,其实只有是不是每个绘画的起点后边有时间,然后其余的是不是全是now对吧?哎,这是我构造出来的这个字段,好,那我把这个字段构造,构造出来之后,你想想我们能不能用last value去获取每个绘画的起始时间?能不能行,哎能不行,咱们来分析分析啊,OK,好,那假定呢,我这个数据摆在这儿了之后呢,我在这儿我加上一个last value,当然last value里边呢,我需要传参数来吧,那传谁呢。注意我不传TS的,这次啊,我传谁,我传这个C4,传这个字段啊,传我构造出来的一个字段啊好,那完之后我第二参数是不是是否跳过闹纸啊对吧?那我跳不跳闹值呢?跳闹值我是跳闹值的啊好,那么后边是不是得写over over里边是不是得写那个partan和order啊对吧?那partan咱按谁part还是按照m mid partan,那OY呢,仍然是按照这个PSOY,好那完之后我们看一看我们加上这个抗生发生之后,咱得到的效果应该是什么样的啊来咱们还是假定一下啊,假定这就是同一个人的两个绘画,OK啊,咱们来看一看他能不能解决这样的一个问题啊哎,这是一个人的俩绘画对吧?完之后呢,我们呃,M mid,因为都是相同的嘛,对吧,它是会分到一个区里对吧,时间咱们也假定它正好就是有序的,好那我们来看一看这个last value是如何运作的啊,首先我们先看第一行,你在第一行的时候呢,咱们的窗口范围是什么,第一行到单一行对不对,那所以说我last value拿到的这个,呃,C4的值是不是就是它这个没有悬念对吧。
40:33
OK,那这儿我就已经拿到了它了,那之后继续往下走,那你到了第二行呢,第二行是不是第一行到当前行前两行啊,对吧,那前两行我last value取最后一个,但是呢,我会跳过闹值,跳闹我得到的是不是就是它没问题吧?好,那这个就会放在这个位置,好继续往下走,一直走到哪的时候啊,一直走到走到这儿,走到这儿其实咱们是不是都会跳过闹值,找到第一个不为闹的数啊,对吧?哎,都会拿到它,所以这个是没有问题的,那关键问题来了啊,我们看下边到了第二个规划,它会发生什么样的情况啊,到了第二行的时候呢。
41:07
哎,到了第二个固话的时候呢,我现在的呃,窗口范围是什么?是第一行到的一行是不是应该是这样的对吧?好,那然后我要拿的是什么?是最后一个不为not的值,最后一个不为not的值是不是正好就是它,对不对,是它,我是不是就把它拿回来了,我就不会再去拿第一个绘画的开始实间了吧,对不对,OK,那这样一来的话,我们继续往下走,你走走走走到这儿的时候,我拿的其实都是谁,是不是都是第二个绘画的起始时间了,对吧?哎,那这样一来我就能解决咱们刚刚呢,就是同一个人的两个绘画混在一起的问题了,哎,是其实不管你有几幅画,你有两个也好,你有三个也好,那我下边是不是都没有任何问题。对不对,你要你比如说我有三个规画,那我下边进到下一个绘画的时候,我last value里,我是不是就取他了呀,对吧?诶,那这样也不会有问题的,那所以在这呢,我们可以通过这样一种方案去获得咱们想要的这个绘画的起始时间,哎,是这样稍微的有一点点绕啊,OK,好,那其实把这个东西讲明白之后,其实好像听起来也就不难了,对吧?那现在呢,我们把这个circle给它最终的实现一下啊这个咱们怎么做呢?可以这样做啊,首先我先把这个呢,给它起个别名吧,我们叫做session,呃,然后呢,Start point,那这个呢,我们称之为是一个绘画的起点,对吧?那之后呢,我们把它作为一个查询来CTRLX,然后这呢来一个括号,之后呢我们CTRLV,把它往前推一下,这个随便起个命名,我们称之为T1之后呢,我们就可以select是不是from这个T1了,对吧?好,那现在呢,我们把这里面这些关键字段还给它取出来啊,一个就是mid。
42:35
咱拿到还有一个呢,就是last配置ID,那就是配置ID咱也拿到再往下呢,谁TS对吧,那之后呢,再往下走,是不是就是这个所谓的session start point来对吧,这个我们应该怎么处理它来着,是不是使用last value去获取他们,呃,咱们选要那个值啊对吧,Last value里边能放谁。呃,放放谁应该放那个3START point对吧?然后第二个参数是必须得传个处得跳过闹纸啊对吧,然后边怎么处理呢?Over里边咱就写part替身BYBY谁mid就行了,Older by这个TS那就完事了,那这样一来我们就能得到咱们想要的那个时间,那当然呢,我们最终还需要做一个操作才能得到mid啊,怎么做做怎么做来着。
43:15
咱是不是还得再来一个?设备ID跟他拼一下才行啊,对吧?OK啊好,那咱们用谁跟他拼呢?哎,用慷开拼对不对,慷开前面先加一个mid,那后边咱们需要给它放上一个连字符啊,给它稍微的隔一下啊,之后呢,咱再把这个给它放进来之后注意观察,我们再把这个词给它执行一下走。看一看最终的效果是不是我们想要的啊,来大家看一下,首先这是不是就是一个典型的绘画呀,对吧?然后后边你看咱们加的这个midd,呃,加的这个30ID,加的30ID,首先呃,这个mid就是取自于这这个没什么可说的人重重点看这个时间啊,这个时间是不是都是幺幺,是不是都是第一个呀,对吧?这应该是没啥问题的啊,当然呢,我们这可能看不出来这个效果啊,因为我们自己模拟生成的数据就是我们每个访客也就只有一个绘画,咱们找不着这个有俩绘画的访客,那所以在这儿呢,这个效果看不出来,但是我们这个逻辑理论上应该是没有问题的,对吧?OK啊,那根据我们的分析应该是没啥问题的。好了,各位同学,那截止到现在呢,我们就已经完成了这个绘画的划分的工作了,那当然呢,呃,其实只要把这个绘画分好了,那你说我们这个表里剩下的字段是不是就简单了呀,对吧,你就需要哪个字段,你就从里边去拿就完事了,对吧?这个拿字段我就不再演示了,这个一会儿咱们看一下最终结果就行啊,然后呢,这个划分绘画我刚才其实已经说过了啊,就是划分绘画这个事呢。
44:34
由于这个绘画ID是咱们自己设计的,对不对,我们是自己设计的,对吧,那完了之后呢,所以说你是不是可以有不同的设计方案呀,没没没错吧,OK,也是在这儿呢,这个划分绘画的方案不是唯一的。对不对,还可以有其他的方案,比如说我举一个简单的例子啊,你想一想。咱这个绘画ID是怎么确定的?是两部分组成,一个是mid,一个是一个绘画的起始时间窗,对吧?你可以这么设计,我也可以换一种方案,比如举个例子,我随便给他设计啊,比如说首先一部分我用mid,另外一部分呢,我不用时间,我就给他放个啥就行。
45:07
我就随便给他放个序号行不行,比如说第一个绘画,第一个绘画我都给他加个一,那这一个人他的第第一天的第二个绘画呢,我给他加个啥呢,我都给他来个二。我是不是也能够实现咱们这个效果对吧?因为我绘画ID只要保证什么就行了,保证你能唯一的表示一个绘画就完事了,对不对,那我m midd我能把不同的人的不同绘画区分开对不对,那我后边加个一加个二对不对,我能把同一个人的不同文话区分开,是不是不是也能区分开啊,对吧?所以说我们也可以有其他的方案啊好,那现在问题来了,那假如说我们现在需要再来一个方案,那另一个方案咱们应该怎么搞?另一个方案怎么搞,那我现在就明确一下,第二种方案就按就按我刚才说的来啊,就是两部分组成,一部分呢是设备ID,另一部分呢,我这儿就是一个数字一,然后后边呢是二,然后后边呢是三。那应该能听懂对吧?好,那大家琢磨琢磨,你说这种方案我们要想实现的话,怎么去做,呃,我把这个呢,CTRLC拿出来,我先给它放在CTRL放在这儿吧,咱们还是先把这个原始数据给它查出来,然后大家照着这个原,诶我这个多选了一个啊,这个咱们暂时先不要了,给它去掉原始数据,先给他查出来,然后大家呢,就照着这个原始数,原始数据琢磨琢磨来我第二种方案,我要想实验,我可以怎么做来视频我先停一下啊。
46:24
呃,来各位同学,那接下来呢,我们再来看一下另外的一种思路啊,呃,其实刚才这个同学说的是正确的,这个思路是完全可以实现的,好,那刚才同学思路什么样的呢?我先把这个思路给大家说一下,然后咱们再去实现啊首先呢,他的思路是这样的,在这儿我们需要先去构造一个字段,那这个字段呢,呃,跟刚才那个逻辑差不多,也是如果是起点的话,也是last闹对吧,那我就怎么样呢?我就给他个一,那否则的话呢。全给零对不对?那你比如说以它为例啊,这是一个绘画对不对?OK,那这是不是全是一,后边全是零啊对吧,我把这个写上吧,写上之后咱们看着是不是更清楚一点啊对吧?来这个拿过来,在这呢,我来一个if if应该是呃,配置点这个last下划线配置下划加ad,哎,Is now,对吧,那我就给一,我就否则的话呢,我就给零对不对?那现在呢,我就给一个这样的字,好再来看,那这个效果现在是不是很明显,我们得到的数据是不是就是这种啊对吧,好了,那完之后我们看一下下边咱们怎么处理啊,还是假定啊,这就是同一个人的两个绘画,大家看啊,这是两个一,其余的是不是都是零啊对吧,两个起点啊好,那么之后我们用什么去进行标识呢?我们用数字对吧,后边我用一个sum姆求和的函数,那萨姆求和,当然对谁求和呢?还是对构造出来的这个字段求和好,那我后边是不是得写O,里边那些part提得写O啊,对吧?那part提仍然是按照m mid进行part提,那假定这是一样的啊好,那完之后排序还是按照TS排序,假定它是有序的好,那完之后我们往下走,你看。
47:51
那我们这个结果得到的应该是什么?好,那你比如说我在算第一行数据的时候,那因为我有order y,我的窗口范围就是第一行到单千行对不对,是不是只有这一行对对吧,所以说我得的值应该是一,这个没得说对吧,那接下来往下走,你看到这的时候呢。
48:06
乘法范围第一行单千行两行,两行一个零,一个一,是不是结果还是一样对不对,继续往下走,一轴走走走走到哪的时候,走到这儿的时候全是一吧,就是一加零是不是都是一啊对吧?好,那继续往下走,那你到这的时候呢?哎,你就会发现,OK,第一行到当前行求和,我就等于二了,对不对,然后继续往下走,一直走,走到这个第二绘画最后的位置一直都是二,对不对,然后再往下走,你比如说到第三行的时候,第三个绘画的时候,那我就变成几了,我就变成三了,对不对,这样一来是不是也能把同一个人的不同规划区分开呀,对不对,这样也行啊,好了,那这个完成之后,我们把它实现一下啊,这个随便来一个别名叫做number吧,然后我们应该给他是不是起一个这个,呃,来一个子查询啊,对吧?来子查询这个往下推一下,这个我们起个别名,比如说也叫T1,然后现在咱就可以select,呃,然后呢,这个from,这个T积了,那S拉from的话呢,我们其实可以是不是基于前面这个稍微的调整一下,对吧?来CTRLC拿过来好,那这里边咱们怎么改呢?首先这里边的开函数我们应该用。
49:06
萨求和呀,对吧,那这里边我要加的那个字段应该是number字段,那这个就没有什么true和false之分了,对吧,直接求和,然后后边用改,后边应该是不用改的吧,好,那现在呢,我们把它执行一下。稍微等一下,OK,那你看这个效果是不是就已经出来了,对吧?好,那这是同一这一个人的一个绘画对不对,他是不是都是m midde加上一个一呀,对吧?当然这里边没有二了,因为我们确实生成的数据不存在一个人俩会画的这个情况,所以这全是一啊,但是这个逻辑应该是没有问题的,好,这是咱们解决这个绘画划分这个问题的第二一种方案,行了,这个方案讲完之后,我把视频停一下啊。啊好,各位同学,那咱接下来呢,呃,给这个数据状载做一个呃,最终的收尾,呃,这里边我们需要干啥啊?呃,其实咱们现在已经完成了最核心的一个工作就是画和规划了,那接下来咱们要做的工作应该有什么呢?咱们咱们咱们自己,呃这个说一说就行,然后就不再写了啊来咱们琢磨琢磨应该做哪些工作,首先我们需要先把上述的这些咱没选的字段是不是全部都给它补全呀,对吧?这个补全得从哪开始补?
50:09
注意啊,这是咱们最终得到的结果对不对?咱得从哪开始补,你得从里边这个T1的查取,是不是一层一层往外补,对吧?我们需要先在T1里边把我们所需的每个字段都选出来,比如说在这儿呢,我给他选一个common点,比如说BA,那上边呢,咱是不是才能去选择这个BA呀,对吧?OK,那你需要按照类似的这种方式呢,从我们这个日志里边把每个字段都给它选出来,那当然都选完之后,有些字段咱是不能直接拿到的啊,首先第一个就是pro ID,这个我们还需要再去做一做一层关联对吧?这个跟那个省份面关联一下就行,对吧,这个比较简单,然后再往下,咱们还有谁拿不到呢?这两个字段咱们也不能直接拿到这个,一个是data ID,年月日,一个呢是呃,View time是呃,带有十分秒的,对吧?他俩我们没法直接拿的,但是我们可以从谁取呢?是不是可以从这个TS去取啊,对吧?OK,那这个TS它是一个时间串,那时间串是不是又得往这个时间字符串进行转换呀,对吧,这边我们还得用哪个函数,得用那个带时区的函数吧,比如那个from u TC time代吧。
51:14
那个函数大家还有印象吧,哎,我们之前是讲过这个函数它是对传实序的,所以这呢,你还是需要去做对它做一个处理,OK,这是大家需要去特别注意的地方,其实别的就没什么特殊的了,OK啊,那咱们现在已经罗列出来了,我们到底需要干啥了,那我们就不需要再一点点写了啊呃,咱们知道呃,怎么做就行,我们看一下最终的这个状态语句就完事了,来拿过来诶把这个CTRLZ咱们粘出来,粘了之后呢,我们放在这个位置啊呃,前面这两个东西咱们就给它留着吧啊然后呢,我就不再替换了啊,那之后呢,我们CTRLV,诶放在这儿,这是咱们这个最终的一个装载方案啊来,我写一个最终最终版啊好,那现在咱一起来看一下这个最终最终的这个完整的词号咋写的啊,来,首先我们还是先从子查询看起,先看第一个子查询来看这儿,第一个子查询其实跟刚才我们写的那个差不了太多啊,你看这里边是不是就是like,然后呢,From这个OS log IC这张表,然后找到它是不是14号的这个分区啊,对吧?啊,这个没啥可说的,然后呢,把配置ID,哎,不为空的给他,呃。
52:15
呃,拿出来对不对,那之后呢,我们是不是也是获取了一个这样的session start point字段,这是给后边咱们划分绘画去用的吧,对不对,然后呢,他这比刚才咱们做的多的,就是他把所有的资料该选的都选出来了,对不对,选完之后接下来往下走,那下边呢,他是不是紧接着就去跟这个省份表做了一个join呀,对吧,这个join完之后,咱是不就能拿到那个想要的pro pro ID了,对不对,然后往上走,往上走走走走,诶转完之后呢,那这就是他们最终的一个C语句,好,那这个呢,是我们划分绘画的那个表达式,对不对,那这个呢,是获取我们那两个时间的表达式,这个应该很熟悉吧,这个我就不再解释了啊,然上面的这个字段就是逐个的去取就完事了,最终把结果写到哪个分区,是不是只写到这张表14号分区就够了呀,对吧?他需要写到多个分区吗?完全不需要,为什么呢?因为我们刚才说了,这张表我们现在只有十字号一天的日志,一天的日志就放到一天的分区,那就完事了,诶好了,那这个表的装在一句咱就讲完了,来视频我给他停一下。
我来说两句