00:00
好,来,我们看一下这个非常重要的这个窗口函数,在大量的需求当中都会用到这个函数。而且特别好,它的一个出发点是什么样子的,是这样的,我们写这个语法呀,来看一下啊,假如说我这个地方,嗯,Select我先写一个啊select心放这个烟P,我拿一下这个字段。我现在要做什么事呢?这个里面是不是有很多人的,这个什么manager是同一个人啊。我现在要做这个事,来看一下,我要select。第一。PT number。啊,第一批,然后我要做什么事呢?我要count。心。From EP这张表,然后我要做一个什么呢?我group,因为写了一个东西,对吧,Group。这个能过吗?对吧,大家都知道这个东西肯定过不了,对吧,主要是因为你看这个东西。
01:11
没有在公外里边,同时它还不在巨额函数里面。对吧,那这个时候呢,就会用到我们接下来要用的这个。窗口函数,我们窗口函数可以解决这种问题。啊,可以解决这个问题,那我们继续往下看啊,就是为了解决当前这个需求,因为go back是不是解决不了我们这个需求。对吧,我想求每个人啊,它所在的一个部门,假如说这样,我要求每个人的姓名,然后以及这个人所在部门有多少个人。啊,也就是说刚才的缩应该改一下对吧,应该要是部门的话,这边应该写一个DPD,那么如果说这个能执行,我们想象一下它那个执行结果应该是什么样的。是不是假如说这个D0NUMBER有ABCD4个人。
02:02
啊,假如说AB是一号部门的,CD是二号部门的,那结果我们想想应该是A2B2C2,如果他能执行,是不是应该得到这样的结果。这没问题吧,但是很可惜他什么。执行不了这个需求就是我们要求每一个人的姓名,以及这个人所在部门有多少个人。对吧,也就是说原始数据和聚合后的数据,我要把它放在一行。勾BY不行,勾不行的原因主要在于哪呢?因为勾BY这后面那个字段是一个聚合函数,你是什么?就是抗的心是一组一个值吧,但是一个组里面第一批number是N个值啊,N跟E匹配不了对吧,匹配不上啊,那我们窗口函数就解决这个问题的,好,我这个先执行,反正他报错对吧。这个能走,我改成啊,我改成第number了是吧,我改成第一批number了,这个确实能走,就是我们刚才所说的那个点那个点,那这个时候呢,就要用到我们这个。
03:09
Over啊,就会用到,因为在前面我应该写de number对吧?啊,准备写的是p number,不是de BD number,刚才那个语法难过,也就是说前面是员工编号,然后我要看这个部门所在有多少个人看心好,那这个时候呢,用到我们窗管函数这个地方呢,指定分析函数工作的一个数据窗口大小。然后说这个数据的窗口大小可能会随着行的变化而变化。能看得懂吗?就是每一个字都认识,但是连在一块也不知道他想表达什么东西,是不是这种感觉对吧?啊所以呢,我们要通过案例来做这个事啊,来做这个事好,然后下面还有一堆。还有一堆,这一堆干什么事呢,是跟我们这个来连接使用的。
04:00
啊,连接使用,因为在这里边先定窗口函种的啊,其他连接函数我们先要搞定这个O。先要搞定这个OPPO。我们继续看需求来。现在是这个样子的,里面有一个数据叫name all the cost。Cost这个数据集没问题吧,是这样的,这里面呢,有一个人1月1号买了十块钱的东西,对吧,然后托尼。1月2号买了15块钱东西,没问题,数据集是这个样子,好,我们先把这个数据集拷进来,然后呢,把表给他建一啊把表给他建好来,在这块我VI一个。Business对吧,Business点然后。最后这个空行呢,也不要。好,然后接下来。呃,可瑞的是不是好久没写这个见表语句了,对吧,Table。叫business。
05:00
然后段三个,第一个是name对吧,啊类型。第二个是一个什么or啊,也用什么词边类型啊,反正它中间用杠对吧,最后一个是cost对吧,花费。啊,DOUBLE4IN特吧啊,反正我们写的都是整数吧,对吧,刚才写的都是整数,那用in或者double都行啊啊然后还要指定什么。分割吧,然后是的,然后是对吧,S fail termin。逗号,这次我们按逗号分开的是上啊确定,然后呢,Load data叫local把数据给他先导好,然后配到这。啊,这样更快一点加进来,然后叫business点对吧,啊在这个地方啊拿。
06:02
然后into table叫business,叫这个内容。好,然后C新我们查一下这个数据集,应该是没有问题的。走。没有问题吧,好,接下来我们看一下需求。啊,这有一堆需求啊,一堆需求,第一个叫查询一下在2017年四月份购买过的顾客以及总人数。写在条件里。这个需求能看得明白吗?假如说这个里面呢,有逆。和mark购买过,那我们要的结果应该是这样的,你后面一个什么。二然后有一个mark,有一个什么啊,我们要的是这个结果。啊,就是结果集现在需要这个样子。没问题了啊,因为他的需求真的是这样这样的,当然这个2017年四月份这个你先不管。
07:03
这个就是固定条件吧,假如说我先把这个干掉啊,省得想的更多,我现在就要查询总共购买过的。人的姓名和总人数,那很简单,结果只有三个人嘛,也就是说我将来输出三条数据。三条数据两列,第一列三个名字,第二列都是什么三。对吧,啊,都是总人数都是三,那这个如果说按照我们之前所讲的,只能写什么select name comes新,然后from这个business grew back。什么东西啊,也不用勾了,直接就是靠的新对吧,因为总人数也没有那个勾back,因为有四月份我们可能是勾以下这个V要条件四月份嘛,对吧,也就是说现在的需求变成这个样子。谁来的?然后一个什么。看新看新啊,不行还要干什么?驱虫,对姓名进行驱虫有多少个人对吧?啊的啊的DS的什么。
08:07
好,那我们要的是这个结果集,但是这个东西就跟刚才我们跑的那个前面那个举的例子一样,这个能好吗?这个东西能跑吗?就是前面是一个内,后面是一个聚合。不行吧,啊,这个不行啊,这个不行,那这块呢,要用到我们那个窗口函数来看一下,我们就针对于第一个需求啊。这个建表导入数据我们都已经做过了,来看一下啊,做一个对比啊,第一个。只是在原来这个是不要条件吧,啊不要条件,这是原来的基础上做了一个什么事。加了一个OPPO。啊,在这个去函数也就over,首先它这个使用的位置啊,你不要想着通过第一个需求,我们完全的搞懂这个over,一步一步的啊,整个的需求做完,咱们对over有个理解啊,有个理解第一个先呢,直接加一个over函数。
09:10
啊,加一个offer函数这个内容。好,如果说不加over的时候,我把这个拿过来啊。不加我们看一下结果我加了对吧,来。报错这个不会报错吧,这个不报错,这个肯定这个是出来什么结果。这个人应该是求的在2017年四月份购买过的人,以及这个人购买了多少次。有没有问题对吧,当前我写的这个是这样一个情况对吧,OK,我们走一下啊,把这个跑起来。也就是说四月份购买过的有两个人,一个借口一个骂,这两个人呢,借口购买过一次。
10:00
Mark购买过四次,但是我们要的刚才我们说的是不是应该是接个2MARK2对吧?好,然后呢,我们把这个O给它加上啊在这个,注意over函数呢,一定要加在这个聚合函数的后面。来,我们把它画下。看一下结果的一个不同啊,慢慢的一层一层的来理解这个窗口函数所起的一个作用。发现他跑了两个任务,发现没。啊,因为每一个窗口函数都有一个独立的任务。这不第一个都跑完了吗?啊,又起了一个任务,叫个二对吧。然后总共两个嘛,这是跑第二个。
11:04
结果是我们要的M2这个二。对吧,这个是我们要的结果,那问题就在于为什么加了一个over之后,那肯定是over起作用,对吧?那肯定是over起到作用,好,那我们就要通过这个案例来说明一下这个O到底干了什么事在里边。啊好,那它必须要跟在聚合函数后面。这个东西我们把它叫做开窗,开窗啊开窗的意义就在于它对于整个的数据集啊做了一个。开了一个窗口,这个窗口就是数据集。啊,这个窗口呢,就是数据集啊,这是第一点要记住啊,开了一个窗口就是一个数据集,那接下来看的新,而且他开的数据集的作用范围。仅仅是给他用的。首先要理解这个,第一个是我们所说的包括函数,它代表的开窗对吧,开窗等于开一部分数据集出来。
12:07
第二点,我们所用开窗函数开出来的这个数据集给前面这个什么。聚合函数使用的。旧函数使用的,那这是什么意思?是这样的,假如说我数据集。比较大,有很多我可以用开窗函数,当然我们开窗函数具体怎么开还没说,我可以用开窗函数干什么事呢?我把这个整个的数据集100条,假如说我开窗里面规则这个50条,这个25条,这个是25条,最后这个前面聚函数,无论是sum,还有avg,还是那个com也好,它只作用范围就是你是50点,你是25,你是15。就是它把它的一个整个数据集划分成一段一段的。啊,这是第二点,我们要理解的第三个开窗这个东西呢,Over这个函数啊,我现在括号里边什么都没写对吧?是一个空的,它里面可以传参,但是此时它是一个空的,空的代表什么意思呢?对于整个数据集进行开窗。
13:12
对于整个数据进行开通,这是第三点,这第三点啊,第四个比较重要的,它是给每一条数据都开了一个窗口。也就是说,当我们来看啊,我把它整体干掉的时候。这个数据集是什么样子?就是一个Nick一个ma对吧。应应该是借是吧,是Jack对吧?啊借和骂是不是啊,我们看一下这个数据集。啊,一步一步的啊。好,首先这个数据集没问题吧,我把OPPO这个干掉,这个大家肯定很好理解,好开窗的第我们说的它是给每一条数据都开了一个窗口。
14:05
也就是说,当我们加上这个内容,我们把这个数据集拿过来。给他拿过来,好到你这条数据的时候。我要计算这个count的时候,我是不是要接下来提到看的第二个列嘛,要计算的时候,这个时候之前按照之前的逻辑,如果说我没加这个内容。它是不是针对于内整个的来计算啊,但是现在不是,它对于我们刚才group by之后的一个结果集,对于这个结果集重新进行开装计算这个抗能,而且我们之前说了。O里面不传函数。开的窗口大小是多少?是所有数据。对于所有数据针对的,也就是说针对于Jack这条数据,我要给他开一个窗口,这个窗口大小全局的。那看的新出来几条数据。
15:00
就是二。那接下来骂也一样。我针对于ma这个东西呢,也开了一个窗口,也是二。理解一下这个东西,当然我们后面还有更多的需求,你不要指望这一个需求能搞懂这个开窗,因为还有很多的一个需求来慢慢的理解啊,现在呢,我们要记住一个点开窗函数,它跟勾不一样。不一样在哪go呢?如果说你这两个东西,假如说某一个字段相同,我要按照这个字段进行分组,出来只有一条出去。这没问题吧,公办是不是一个组里面一条数据啊,开窗它是针对于每一条数据开的。就当你这个的时候,我给你开了一个窗口,当你骂他的时候,我又给你开了一个窗口,也就是说你有十条数据,我就开什么。十个窗口,那所以我们这块写的什么com,甚至我可以这样,呃,我看一下那不行,因为这个过干干不掉啊这个问题,因为那如果干掉的话得加去重,如果不去重的话,那数据集就多了啊,数据集就多了,那这样我们做这个事啊来看。
16:13
来帮助大家理解一下,我把这个数据集呢,现在改成这个样子,大家也能看得懂。这个数据集能不能看得懂?这个代表着只要在2017年四月份购买过的人有哪些对吧,没做驱虫,因为驱虫有两种方式嘛,我可以用驱虫,也可以用什么group去中对吧?啊这两种,那我们把它走一下。放在这儿是不是有五条数据对吧,我对它进行一个什么。开创懒。这块呢,靠。心,然后这块要加一个什么over,因为你不加over这个语法能走吗。走不了啊,但是我加一个什么。
17:00
O。之前我们说的你不加over是不是走不了,现在加了over能走了,而且来就先不看数据集,就刚才我们看到的是不是must出现四次。按照刚才我们所讲的窗口,根据你们所能理解的范围,接下来这个数据集变成什么样?首先你既然查的是,那这个数据是不变。后面这个东西。应该怎么来?好,五,第二个呢,五吧,下面都是什么?全是五啊,全是五,你要体会一下这个东西内容跟勾是不是有区别,如果这块我们用的是不是op,而是go by。而by name,那将来出现的数据应该是Jack什么?
18:01
1MA4是不是这个内容对吧,这就是O跟。勾BY的区别勾,因为你这个是你按照姓名进行分组,不好意思,你这一组我将来只有什么。一个值就会只会出现一个什么四,但是我现在是什么。开窗,而且我说了,开窗是针对于每一条数据开的。对吧,也就是说你在计算com的时候,你有专门自己的一个什么数据集,这个数据集到底是多少,看你的O。而此时这个O里边我们是不是写的空啊?也就是说整个数据集吧,整个数据集是不是五条数据,那它的结果应该是这样的,我们来看一下跟我们猜的是不是一样的。有没有问题这个东西。这个地方呢,也就是说我们整个的是对这个来的。啊,首先我们之前是不是计算出来一个这个结果,当我们加了一个抗的锌,然后加了一个什么over之后,它就变成这个样子。
19:08
那你看这个是不是原始数据一个内跟具有函数直接在一块,我没有写勾,没有把那个name放在勾里边,对不对?那是因为它跟勾有个最核心的区别,就是我们所讲的O函数是针对于每一条数据。来开到窗口啊,窗口大小是你OPPO这里边的什么。参数决定的,我们传了一个空,那就是全量数据集,来看一下它的别名,我们有取别名啊,它叫什么?抗的温度零。看是不是我们那个函数啊,窗口函数啊,第零个窗口,因为你可以在一个语法当中写多个O啊,这个是可以的。啊,这是我们第一个需求,稍微的去理解一下我们所说的点。啊,两点比较重要的。啊,比较重要的就是最核心的跟group by之间的一个区别勾是分组函数,一个组出来什么一条数据,而O它虽然也要分组去求count新也要分组,因为你count新是不是一个聚合函数啊。
20:13
既然你能用具函数一定有组啊。一定是有阻的,而他这个组啊,不是说。你那一样的放在一个组里边,我是针对于每一条数据都有一个独立的组。能够理解这个事儿啊,通过第一个需求呢,我们先掌握这个内容啊,先掌握内容,我把它解一下啊。
我来说两句