总结完SQL的理论知识之后,还是要实际做题落实到应用里去的。
光知道各个部分的理论知识只能写出最简单的SQL,在实际业务中会有很多应用情景,我们要熟练,才能有效率地完成工作。
跟数学一样,知道知识后,还要做题,各种题型,才是真的掌握了。
这是从学到用的一步,需要好好落实。
面试不会只是机械地问你SQL的一些基本概念,而是会出题让你写,问你怎么具体去做。
建议可以去刷牛客网的题或者百度搜一些其他网站或者其他文档的面试题都可以。
时间日期的处理
一、跨天的最晚登录时间计算
获取用户每天在21:30-04:30的时间区间里最晚登录的时间
这个问题的重点在于时间跨天了,如果只是一天内的时间段,直接group by然后max(时间)即可。
跨天则没法直接对日期group by,这里我选择的做法是直接把时间-4.5hour,既然是跨天,那我就让它归属于同一天即可。
获得时间后,再加上4.5个hour即可。
这个思路是我在处理海外手游时想到的,打点上他们的时间是没错的,只是推送日报的时候,因为跨时区,我需要延迟时差去推送。
二、连续登录天数计算
情况1:求最大的连续登陆天数
选出用户的最长连续登陆天数,比如用户一个月里有连续登陆2天、4天、5天,怎么查询去获得最长的那个连续登陆天数
转化为编程问题就是一个001100011110000111110000000字符串,选出1字符串的最大长度。
考点是连续,连续的条件如何判断,
我选择的判断逻辑是,两个日期的日期间隔+1与实际表中登陆的天数相等,则为连续,如果中间有不登录的日期,则间隔+1不会与实际登陆天数相等。
网上查到的别人的写法,判断逻辑是连续日期与连续开始那天的diff相同,这个方法写起来比较容易一点。
建表:
方法一:判断连续日期逻辑为,连续日期中的每一天与连续开始那天的diff相同
参考: