00:00
那接下来呢,我们看这个窗口函数啊,也就所谓的这个开窗函数,嗯,它呢,整个的一个说明啊,在这个还是打开的这个select的,就是说在第六章还是这个地址啊,我就提前打开的还是还是这个地址,对吧,直接这个select啊这个呃,在哪呢,在这。窗口over按的这个分析函数对吧?嗯,可以点开啊。反正班里网速就是会差一点,嗯,他呢有很多种写法,当然我们用到的时候呢,再来具体的去看,因为有一些东西呢,我们需要结合着官网去做一些说明啊,让大家去看一下,嗯,首先呢,我们来看这啊窗口函数。在这窗口函数,其实窗口函数只有一个啊,就就是这个OPPO。
01:00
它指的是开窗,开一个窗口,所谓的开一个窗口指的什么意思呢?就类似于back这种感觉。Go半是不是说将按照某一个字段进行一个什么分组,对吧?啊进行一个分组,Over也是一样的,它也是对某一个数据集进行分组,里面呢,也可以指定字段,也可以指定字段,但是它跟那个go back还是不同的,如果相同就不用讲这个了,对吧?好,那不同点的人哪呢,说这个窗口大小可能随着行的改变而改变,那就指的什么意思呢?假如说我们所聊的go by。我按照部门ID进行分组对吧?那只要ID相同的,他是不是在一个组里边对吧?那只要ID都唯一的,将来你勾后面的数据应该都就把这几个数据聚合到一起了哦,就算我们按了ID仅行分组了,后面可能每一行大家都叫ID1,但是它看出来数据可能不是的,因为我们可能有五个ID唯一的,假如说用group,这五个ID唯一的一定是分到一个组里边就一起做计算的,但是O尽管我们可能写了按照ID分组,但是有可能每一行数据开的这个数据节大小都不一样。
02:27
啊,这是它核心的一个区别,待会呢我们具体来聊,我们要通过下面这一套案例来说明,也就五个需求来看一下整个这个窗口函数啊,你不不是说一个需求我们就能完全的搞明白,因为窗管数呢,还是稍微复杂一点的,然后接下来看下面一些东西啊,这一套叫什么?当前行啊,叫往前多少行,往后多少行,从起点对吧,从终点。啊,到终点不能叫从终点了到终点了,这个是用来在写在哪呢?这一套东西是写在O里边的,就是用来限定当前。
03:09
分组的行数啊,用来限定分组的行数的啊,就是这个意思啊,然后接下来还有下面所谓的leg lead,还有这个until,对吧,这个东西呢,是写在over函数前面的。这是往前第几行,往后第几行啊先呢,初步的认识一下啊,等会呢我们来用啊,先在我们看这个数据几啊呃,我们把这个表建立一下,这是一张什么表呢?就是说一张那个相当于消费流水表,就是说前面是是谁哪个人对吧,在什么时间点下了一个订单,花了多少钱。数据集比较明白了啊,没什么难的对吧?好,那我们把这个拿回来,我们用一个business啊。
04:00
把这个放进来保存退出啊,然后接下来呢,我们把这张表去创建好,那这个建表语句也比较简单啊,就是name of data cost对吧,然后还是按逗号分割,因为刚才我们数据集是不是逗号对吧,这个你要看清楚,呃,之后呢,Load data,我还是一样的把这个做一下啊。还是把have干掉,然后四干掉,然后table business,好这个我就一把粘过来,就是见表加导入数据一起做的,三角心from这个business这张表,这个数据呢,我们就放进来了,对吧,而且呢,我们的时间也是按照标准时间来做的,就是中告啊中告来划分的,对吧?好接下来呢,按照需求查询,也就做这有个需求。第一个,第一个要查询说17年四月份购买过的顾客,就下过单的顾客以及总人数。
05:05
首先我们数据集当中是不是除了四暂还有什么一月二月对吧,五月六月对吧?啊,那首先他要的是17年四月份的数据,所以毋庸置疑,第一步要做一个过滤对不对,先要过滤出来四月份的数据,对吧,那这个地方呢,我们可以用一个啊又引入了一个函数叫。Substre啊叫substre。叫something来表示的好,那首先呢,我们来过滤啊,我把这个写在这,首先呢,把介表语句都拿过来啊,C拿过来拿到这,然后接下来我们看一下第一个需求,就是说查询在17年四份我们要做这个事情,这第一个需求,首先无论怎么样,我们第一步先是不是要过滤出来数据啊,啊我们整好呢,写一下这个S这个函数啊,Select,我们不管怎么样,我们先查一个新版,对吧,我们少写一点东西啊from这个business这张表,然后是不是will,嗯,这然按时间做过滤,要17年四月份用的是sub,那我们看一下这个函数DC。
06:32
那其实一样的,就是跟Java当中什么这个参数能看得懂吗?首先第一个参数是一个什么,怎么是,对吧,你要截什么东西,第二个position是不是位置,从哪个地方开始截,最后一个参数是不是可选项。
07:10
就是如果不加,也就是从你选定的位置到什么到最后对吧,如果加了长度,那就截取你要的长度,对吧,那么问题就是说我们要考虑。就position这个东西,到底第一位是从零开始的还是从一始的,我们需要关注下这个,这就好了,对吧,其他的倒还好啊,那我们看一下谁来的,嗯,Sub括号对吧,他要好几个参数,那我们就对这个分之七,那我们先写个。零,我们一般的是不是说Java当中这个字符站从零开始的呀,啊地理位对吧?好然后呢,我们就随便写一个啊,假如说写一个二。哪张表,这张表。
08:03
零二取的是多少啊,二零两倍嘛,这后面就不用讨讨论了,对吧,这是他说的叫什么叫长度,它不是一个位置信息,如果是一个位置信息,我们还得测一下它到底包不包含这个数据,对吧?从零开始的,好,那我们要取17年四月份。几位啊,七位对吧?好,那我们来取,等会呢,过滤的时候我们数七位,哎,那我们只要这个等于2017杠零四是不是就好了,对吧?啊所以呢,这个就出来了,我们的过滤条件就有了,对吧?正好呢,从零开始的对吧?那所以等于什么2017杠零四。对吧,这个是吧,四月份的数据集过滤出来,好,那我们拿一下,我们就都分布做一下啊,现在呢,数据集是这个样子的,那我们看一下我们的需求啊,我们的需求呢,是要求购买过的顾客及总人数,总人数是。
09:10
几个?两个,但是他不光要两个人,他要什么,还要顾客这个名字,也就是说Jack和ma都要显示出来,那其实如果说我只要取这两个人,是不是可以取我做个去零就好了一下,对吧,我要求两个人是不是说。我先按照。用户进行一个什么分组,然后看新或者看的都可以。就是说来看啊,那此时如果说我要去求,就单独说购买过的顾客。
10:00
可以怎么写啊,对这个东西我们稍加改造对吧,我现在呢,不需要他所有的数据了,我只要顾客姓名,而且是不是要考虑去重问题啊,所以说这个地方我们应该怎么写的什么name。对吧,好,那我们拿一下。两个人拿到了,那么接下来我们要求总人数呢?总人数怎么求啊,这前面加一个是不是count它呀,对吧?啊看了他总人数,但是现在的问题是要什么,他要把这两个都求出来,放在。一个语句。我们先看下这个效果是不是说做到了驱虫啊,因为第驱虫嘛,对吧,那我们再看一下它呢,那这个出来的应该是什么效果,应该数字二对吧,也就是说现在我们想要的效果是什么样子,我们当前这个需求啊,他所要的效果应该是这个样子,后面跟这个什么对吧,我既要有人民,又要有总人数,那想一想这个东西应该怎么求呢。
11:31
看他求出来这个东西,求出来的效果是不是这个样子,对吧,而他求出来呢是吧。我们可以把这两个表求出来,T1T2做一个号集是不是就可以?这没问题吧,我把他们俩照应起来,然后不给照应条件直接用,是不是就达到我们的效果了,但是大家能感觉到这种,你觉得他靠谱,他不那么靠谱,对吧?啊,他不那么靠谱。
12:11
啊,主要在这块不太靠谱对吧,那我们要放在一个里边,那毋庸置疑肯定用到我们的什么of啊,肯定要不然为什么放在这儿呢,对吧,那我们把这两个S改写一下啊,首先第一个除了这种写法。还可以怎么写?就是同样的,我求这个人,除了大家想下还可以怎么写,还可以这样来把这个拿过来,这个地方呢,我们先改写一下啊,将两个搜呢,至少有一点一样的name,然后这个地方我就不用干什么,我用勾,我按照名字进行一个分组,然后查内,那你说他俩的结果是不是一样的。
13:00
嗯。对吧,我们看一下这种情况是一样的,我们先按照新民分组,然后查这个人,这个人不就形成了一个吗?你有多个的话,他也就输出一条,对吧。是不是还是这两个人,这没问题吧?好,那么接下来这个东西我也想用group来改写,大家想一想这个东西可以怎么写?一样的嘛,你都看到的了,所以说呢,我在这边比较麻烦一点了,对吧,怎么做呢?对刚才的这个数据集,我嵌套一个查询谁来的come的什么新from括号这张表呢,我们叫题表,哎,把刚才我们的那个语句给它干什么?拿进来。
14:02
拿进来对吧?啊做这个事就好了,然后直接去看新这个是不是也能得到两个人啊,因为这样的话,我们把至少诶我们是中间少了什么东西看一下啊嗯啊这这多了一个分号,所以他认为是两个搜口对吧,就嵌套一个磁长形去求它的看星也可以,那这样至少这两个思维的拼接的时候啊,都有共同的地方,对吧,刚才那两个你只能去做相应的去做提卡耳机做处理啊。啊,这里有此查询,所以两个任务对吧?嗯,那接下来呢,我们这个跑的就是说它结果肯定是二啊,我们稍微等一下啊,看到它的结果啊,就是说对于一个需求呢,它这个思维的写法比较多,但是这个都不是我们最终要的样子。
15:06
好,是啊,这个没有问题吧,啊,是这样的一个情况,但是现在呢,你要把两个表要形成我们最终的这种关系,还得是做那个所谓的第二级对吧?啊比较麻烦,所以呢,我们换一种写法,要用到我们的over了啊,这相当于是over我们第一次使用啊,所以呢,我们直接去直观的感受一下啊,所以那个呢,我们该怎么写呢?首先既然name还要是不是放在这第二个位置,它是不是要总数啊,那我们就写一个看心。啊,看到心放在这儿,然后FROM1张表对吧,还是这个business这张表,然后group,那这个搜大家觉得能好。买个里边这个能。当然我们少了一个东西,这个加不加其实不影响,我们说能不能跑吧,买说个里边能不能跑,能跑,但是结果对吗?结果不对,他是输出的第一个人民跟一个抗心,也就是说在买S当中,他将会输出所谓的Jack啊,Must就没了,对吧,那在have当中,我们看一下它能不能写。
16:21
我们看一下这个内容啊,看一下这个结果对吧。他是一四,这不是我们想要的效果,我们想要的是什么效果好啊对吧?哎,你这个东西呢,按照内部进行分组,然后呢去抗新啊,他求的是每个人在四月份购买过多少次,是不是这个意思啊,如果你要求的这样的需求,这个没有问题。
17:10
但是呢,我们要求的是有多少人,然后几购买的总人数,对吧,我们后面有个二,所以在这边呢,我们加一个OPPO,大家看一下只做了这个事,只做了这个改变,就刚才那个需求是不是一四啊,我只加了一个op,我们看一下这个需求。我们只是跟刚才相比,是不是就多加了一个O对吧?啊,就多加了一个O,我们看它的一个结果。
18:17
直接就变成什么了,225直接就变成225,那我们就要稍微的去体会一下这个所谓的这个over所起到的一个作用,对吧,那你想啊,它是这样的啊,这个over呢,首先它是在group by查询之后生效,首先这个对吧?呃,那假如说把这个去掉。把这行去掉,他是什么结果,不是把这个这一行都去掉,是不是刚才我们说了借康和ma是不是这两行数据啊,去掉的话是这两行数据,哎,加上count的新,单独加count新它是一四,因为按照各自的性名积分组对吧,而我又加了一个什么O,它就变成了二。
19:10
啊,因为它亮的,它呢是开窗,也就是说你看的心就求的东西呢,是我窗口里边数据集的内容,而我窗口里边我有写东西吗?没有,那大家猜一下,你窗口里面没写东西,那他怎么来分配这个数据集?所有的数据,所有行都放在里边,那么我们所有行几行啊,两行对吧?那我们可以很轻松的来验证一下这个事情,我们做什么事呢?来来的新from这个business这张表。那么接下来我做一个事情啊,谁来的?我求内,结合刚才的例子,大家看一下这个东西应该是多少,我看了新,我over,我什么都不写,From这个什么。
20:09
大家觉得他的答案应该是什么?就这样说吧,我把O不写这个circle,就是我先不写over。这个说在买当中能不能运行啊可以,但是出来几条数据啊,买S几条数据啊,一条一条第一个Jack,然后康新呢是四啊,它会丢出去,因为其实想name是不是有14个,而count心呢,一个14个跟一个买四个当中能运行,但是have当中直接画错,Have当中压根就不让你过,因为就是我们之前说的这个是不是说跟我们炸裂的那个效果出来的一样的呀,就是说前面的姿段当时炸裂那个movie是不是三个,而炸裂字段是12个,所以它不让它运行吧,Have当中就是这样的,如果说不对等不让运行,买so可以啊,但是呢,我们来看一下这边感受一下啊,来,我加一个OPPO括号。
21:21
他可以运行,而且他是四条数据,每一条数据后面都跟着是四这个数字。每一条后面我们来看一下,先看结果OK吧,好哎,他呢,14条数据都出来了,而且每一条后面都什么都跟着14,就好像那种测写表的那种感觉一样,对吧,他是怎么回事呢?它跟go核音的区别啊,Go呢,如果说我们用了。
22:04
分组或者说类似于抗新,它就是说将多条数据聚合到什么一条,当然刚才我们看到over前面有个抗新,是不是也是将多条聚合成一条啊,对吧,那这个从这个角度来说是不是一样的,它前面是不是也是跟着聚合函数,所谓的O是不是也是给我们一个数据集,如果不写的话,它就用全表作为我们的数据集14条嘛,对吧,Over开窗,然后呢,前面抗新,所以是14。啊,这样效果是不是看着跟这个公带一样的,但问题最后直行的效果不一样,哎,加了O可以运行,不加over的不行,那是因为over这个函数啊,它是给每一条数据都去开了一个窗口。就第一条他开了一个窗口,他一看O里面什么都没写,全量数据,第二条也是一样的,也就是说这14条数据,如果说我们写的是O括号,14条数据开的窗口都怎么样啊。
23:05
都一样大,都是这么大啊,就每一条开的窗口都是这样子的,它跟group就有不同的分,这个分组而言,假如说我们按照进行分组,我有五个相同的name,是不是五个相同name只有一个组,对吧?而over呢?我假如说后面呢,我也可以按照姓名一分组,对吧,它也是五个相同的名字,但是这五个相同的名字是有五个什么五个组,只不过说你什么都不写的时候,这五个组数据是什么是一样的而已,所以你能看到这样的效果,那在回过头来看他看这个地方,我们是不是说在分组之后,它就形成这样的一个数据,之后我们对数据进行开窗,而开窗里边没有写任何条件,所以对于Jack和ma而言。它的数据集count心求的就是他们俩整体的,所以两个都是二啊,就是我们初步的去体会一下这个over函数,一定要注意,Over呢,它是分组也没问题,它是是不是分组啊,前面是不是要跟句子函数啊,Count some都可以啊,啊平均数这些东西都行,对吧,它是分组,但是它跟group这个分组不同点在哪?想一想。
24:23
刚才讲的来讲了,各是相同组只有一个组,相同的数据只有一个组,对吧?而对于我们over来说。相同的组里边,假如说你有五条数据,它是有五个组的,只不过说这五个组怎么样啊,数据相同而已,所以说它over开出来跟原始数据是一一对应的关系,而go by呢,它不是一一对应的关系,是多对一,所以刚才go by或者说直接加name加count是不让走啊,就不让你运行,但是我们加一个over就这样运行了,是因为每一个name都有自己的一个什么。
25:06
啊,初步体会一下,然后呢,我们还要继续其他的例子来再深入的进行讲解啊,这是窗口的一个初步的一个体会啊,就是你要体会一下跟分组函数就勾不同点,它也是做分组的勾,也是做分组的勾,相同的数据只有一个组,Over,相同的数据照样你有多少条,照样有多少多少个组,只不过说这相同的数据当中它的组是什么是一样的而已,对吧?好。
我来说两句