00:00
好,那接下来呢,我们看一下我们的第四题啊,呃,那么第四题呢,其实从需求描述上来看,这个题呢,呃,它并不难。啊,它并不能啊,但是呢,它实现起来还是挺挺有难度的啊,那我们来看一下,首先呢,这个数据呢,它告诉我们第一个是品牌,第二个是活动的打折开始日期,第三个是结束日期,对吧?那这样的数据那没有问题,还是一样的,这个数据呢,呃,建表呢,我已经建好了,对吧,在这边啊叫TEST4啊之后呢,在这个当中,我把这个数据也粘过来了,也粘过来了,那咱们的数据呢,一个是呃,ID对吧,那我取的是一个ID啊在这里边我记得应该是用的是ID,嗯,看一下我的键表语句啊,呃界表语句呢,用的三个字段叫ID这个东西对吧?啊那把它拿过来啊,那我可以把这个为了跟文档当中统一啊,我把这个也改成ID好了呗,这个倒还好,对吧,对于大家来说无所谓,就一个字段的名称而已,对吧,呃,那这是品牌,第二个呢,是stt start time叫any time,所以呢,STT对吧,这样的一个东西。
01:07
呃,那但是呢,它中间有重复,那我们这样按照品牌先分类啊,先分类啊,我们去思考我们的问题啊,首先呢,正常的,如果说假如说啊,问大家一个问题,假如说此时我们不需要去考虑。这种交叉的数据,因为他在这个地方给我们举了一个例子啊,他说嗯,计算每个品牌的交叉打折的一个天数,对吧,比如说这个VIVO品牌,VO品牌就是这条数据,这条数据呢,他说第一次六号到15号没问题啊,我们看到第二次九号到21号也没有问题,但是其中九号到15号之间,你看怎么样重复了,呃,只需要统计一次,所以在这个过程当中呢,总共应该是17天,那如果说我们分开统计啊,那这是一个几天?11天对吧,那这又是一个。
02:01
三天啊,不对,13天,那这样的话,我们求得的应该是20。四天24天啊,那刚好多的是几谁呢?九到15号多了这么七天对吧?啊,那就有问题了,所以说呢,他要把这个干掉好,那这题呢,我们怎么去分析啊,从最原始的角度来看啊,呃,怎么来看呢?假如说我们大家先思考一个问题,我们不考虑。啊,我们先不考虑这个什么东西呢。我们先不考虑这个。有这种交叉的数据啊,如果说你来做怎么做。对吧,假如说告诉你这个数据当中没有交叉,也就都像OPPO数据,那我们可以看一下OPPO数据啊,第一个活动五号到九号,第二个11号到21号,他俩完全没有交叉,没有问题。对吧,那我可以直接end dt减去start,然后呢,按照品牌做一个sum把它加起来就好了,对不对,那这个就比较简单啊,一减加一做一个品牌累加啊,累加之后呢,我们再做一个处理,其实就好了。
03:12
对吧,好,呃,那关键的问题就在于,呃,如果说按照这种思路来做啊,你看第二条数据就不符合了嘛,就刚才我们分析了它第二条数据算出来应该是一个24。好。就是因为它中间有交叉,那何时会有交叉数据呢?是不是大家应该能反应到,当第一条的结束时间比你第二条的开始时间还要晚的时候啊,或者说即使他们俩相同,假如说我也到九号,你也不能直接算,直接算的话,那怎么样,九号是不是这一天算了重复了?对吧,好,那那在这种数据,那我问大家啊,如果说这条数据我给它替换成16呢,它还有交叉吗。是不是就没有交叉了?
04:02
对不对,好,那这样,那这个要替换,那是不是他也得替换成十呢。那就不对了。对吧,如果它替换成十,那你看啊,哎,那上下两条这是15替换成16,那这个九是不是替换成十呢?不能替换,是不是替换得有条件呢?也就是说什么条件呢?如果说上一条结束时间比下一条的开始时间还要大,或者说大于等于,那么我们才替换,而且用什么替换呢?用上一条的时间加一做替换,所以我刚才这边我替换成16,如果说你用它自己替换15,那15这天还是会重复。好,那我们就考虑这种思路,好,那我继续往下看这个数据对不对啊,那看第三个红米这条数据,呃,那我们刚才说了,把所有数据下移啊,下移的话,第一条数据还是1970对吧,给一个最小值,这个是一个21,这个呢是一个15。
05:03
对不对,好,那这个没有问题,呃,那接下来我们继续来看啊,在这个过程当中,如果说发生这样的数据啊,呃,那第一条数据保持不动,因为它小嘛,对吧,这条数据小就不动,那第二条数据呢,这是21,这是零九,那也就是说相当于这条数据我们应该替换成22 22好,那也就是说这个一减是负数啊负数没关系,最后我们求总和的时候,我是不是可以。只要大于零的数据啊,小于等于零的我通通不考虑,所以这负数就负数,负数说明什么情况呢?当前这个活动被上面一个活动完全覆盖。是不是大家想一下,这两个活动之间完全覆盖,那没有问题的,对吧?啊,那一个负数最后做累加的时候,我可以不累加进去,好这个我们还写一下啊,1970这个是21,那这个呢是15以下来的15,好,那15跟17相比,那这条数据数据是不是保持原样。
06:01
好,那问题来了。如果我们保持原样,你看第一条数据呢,是五号到21号,这条数据17号到21号是不是照样重复,但是按照我们刚才所说的,把上一行移下来,它确实不用做替换呢,因为这样的情况来说,我们不用替换呢,对吧,是不是又遇到问题了,也就是说光把上一行移下来还不行吧,我们得考虑当前这一行数据前面怎么样,所有数据的最大值。因为我们是开始时间,你看啊,我们画一个时间轴,我们按开始时间排序,假如说它是最早的啊,结束时间我们不知道,呃,那接下来呢,我们是不是有时间啊,那开始时间已经在这后面。对吧,开始键引进在这后面啊呃,那如果说如果说你看啊,假如说这样,或者说再来一条这样的数据,刚才我们数据呢,类似于这样的效果,或者说呢,再来这条这样的。
07:00
啊,再来一条这样的,呃,那其实我们在比较数据的时候呢,不能怎么样。仅仅看连续的两条啊,仅仅看连续两条也就什么意思,只要按照这个开始时间排好序的,排好序的,呃,那么这条数据如果它结束时间不是最大的,那么它就都是包裹的,那就算当前这条数据是最大的,那你提供的。打折天数也从前面所有数据当中最大的这个当中去取吧,然后从这个后面往后累加,大家想一下是不是这个问题对吧?所以呢,我们就刚才这个思路呢,不能只把上一行移下来,而应该怎么做呢?而应该怎么做呢?而应该将当前行截止到当前行以前的。所有数据移下来啊,不是所有数据移下来,而是以前的最大值。一下来。对不对?大家思考一下,把它放到当前行,如果说这样的话,那么第一条数据前面到上一行没有数据,还是1970默认值,对吧?好,那么第二条数据呢,21,第三条数据21,那这个21的话,它就变成了22 22只提供了。
08:15
五天对不对啊,在这种情况下就OK了,好,那我们最后呢,拿最后一个做一个校验啊,校验啊26啊,他自己对吧,那1970给一个默认值,那这个是26,这个呢也是26,好,那这两个都是被完全包裹的,没有问题啊,那只是第一条数据起到作用,其他都不起作用,所以呢,我们就用这种样的一个思路啊,那我们把这个思路呢,稍微的去写一写,对吧,那第一步先干什么事?将当前行以前的数据,以前的数据中最大的e dt叫e dt放置。
09:03
当前行对吧?啊,我们不是要放其他的数据,我们就拿这一个案例做举例子啊好,那这个呢,我们应该放1970杠零一杠零一啊,因为它是第一条,所以呢,它还是默认值啊,那么接下来呢,这个地方放20。一啊,这个地方呢,也放21,那这个其实就开窗到上一行就好了,对吧,开窗的时候呢,注意一下,开窗到上一行不要,也就从第一行开创到前一行,不要开张到自己,开创到自己的话,这个是26了,那你这个替换掉27它也是废数据了,那就不对了,对吧?好,那第二步呢。第二步,比较开始。时间与。移动下来的数据啊,那我们写一下,如果开始时间大,那当前行的开始时间大对吧?呃,则不需要操作。
10:06
啊,那那反过来呢,反之反之则需要将移下来,移动下来的数据怎么样加一。替换当前行的。开始实践,好,那如果说我们一旦做了这个事情,那你想一下这个内容变成什么样子,好,第一条数据保持不变对吧,第二条数据这个地方加一应该是一个22,这个就不要了,这个地方呢,也应该是一个22,好,那么此时呢?呃,接下来得到这个数据之后,那就正常的回归到我们最原始的想法,因为此时他们中间完全没有交叉了,对吧?我们把所有的交叉数据相当于去掉了,所以第三步正常计算就好了,那怎么计算呢?就是将。
11:05
呃,数据我们来看一下啊,这个地方应该怎么做一下,呃,那。我们应该把这个去描述写一写,那就把这个end日期减去start的日期加一对吧?啊或者说呢,我们就将每行数据中的结束日期减去开始日期啊,减去开始日期对吧?好,那这块呢,我们就得到了这样的一个数据,好,Red me1减的话,那这个数据是多少?结束日期21。五应该是16对吧,好,那第二条数据呢,是一个负的,那负几我就不不管了,无无所谓了,对吧,啊无所谓了啊呃,那这个呢,是一个正数。啊是一个四对吧,啊是一个四好,那第三步。
12:00
那第三步对吧?呃,第三步过程当中呢,我们应该如何去计算了。对吧,那其实很简单,因为在第二步的时候呢,我们做的是这个值简单,那其实每个加一点啊,但是呢,Data diff之后不能加一,加一它会报错,所以呢,我们应该这样去做啊,按照这个品牌分组计算总和,计算每条数据加一的总和,好,那我换一种啊,那你上面在我们的呃,Data Di后面不让我们写,那我们在这去写就好了,那也就是说第一条数据,呃。总和应该等于多少,如果大于它小于零的话,那我们是不需要的,对吧?啊不需要过滤掉的啊,十四二十应该是一个。是不是?这提供了read me的话,那么应该是20几22吧,那你看啊,它其实日期呢,从六五号到26号。
13:06
那中间呢,是二十二天没有问题对吧,那直接相减的话是21嘛,21再加一天好,最后呢,就得到了每个品牌总和的一个时间好,这是我们整体的一个思路,对吧。
我来说两句