

==这题下手时遇到很多问题,首先不慌,把能写的写出来,问题一步一步解决:

这个是我最初的想法,感觉不成立,因为任意时刻我不知道如何表示
==求同时在线的最大人数应该是一个常考的题目,就算不会也应该背下来

==这是解析的第一步,作者认为解析瞬时最大计数问题应该用编码+联立。对原表中的in_time和Out_time进行编码,in的话观看人数+1,out则-1,再进行两个select的联立,按artical来排序:
==用这个来得到登入和登出的时间,并且用union all进行联立(4.15
==对于这类与登入登出有关的题目,先记录下所有用户的登入和登出时间,并联立,用1表示进,-1表示出(4.17

==然后就是解法的第二步
==将实话,这里我没有看明白,利用sum(diff)over()这段可以的出每篇文章在不同时刻的在线人数。(4.15
==今天看明白了,窗口函数中的orderby是排序,但是也会保留每一步的计算过程,1就是有人登入,再来一个sum后就变2,一次类推(4.17


==利用窗口聚合函数来计算瞬时在线人数,求和diff
==上面的图是这段代码的结果,可以得出该文章在不同时刻的在线人数

==以上是完整代码,对第二步的结果找最大值,注意要找最大值,肯定得得到所有值,另外为了满足题目的那个前进后出要求,这里窗口函数需要加上diff desc


==第一步:先查询每个用户第一次登陆的时间(即最小的登陆时间)----每天新用户表
第二步:因为涉及到跨天活跃,所以要进行并集操作,将登陆时间和登出时间取并集,这里的union会去重-----用户活跃表
第三步:将每天新用户表和用户活跃表左连接,只有是同个用户且第二天依旧登陆的才会保留记录,否则右表记录为空
第四步:得到每天的新用户是否登陆表后,开始计算每天的次日留存率:根据日期分组计算,次日活跃用户个数/当天新用户个数

==注意上面有个不好理解的地方,就是第12行。
这个date_sub的作用是用日期减去一个值。这里的意思就是t2的日期减去1天。
==此题难且经典,需要重复做,首先第一步很简单,利用最小登陆时间来判断新用户。第二步是用户的活跃问题,这类题目上面也有,要想到使用联结功能,将登入时间和登出时间进行联结,然后把两个表左连接,并且使用date_sub函数来保证间隔只有一天。(4.15
==今日再看一遍,依旧精妙绝伦,首先不管别的,将新用户记录表和登陆时间表给计算出来。然后利用左连接将两个表合并,然后用一个date_sub来完成只保留第二天依旧登陆的数据。另外做判断时,使用date_format准没错(4.17
以下是单纯第二步的结果
