sql查询技巧总结:有序集合(连续登陆天数,网页浏览顺序)
看了mick的sql进阶教程的1.9,感觉很多笔试面试题(用户符合网页浏览顺序的网页浏览记录,用户连续登陆了几天,有几个连续的空座等)都是用这个技巧解决的,就在这里分享一下:
技巧:
第一步:用自连接生成关键点的组合
第二步:确定这些关键点要满足的条件
第三步:用exits谓词确定处于关键点间的各点要满足的条件
下面是几道例题(来自之前网友分享的笔试题以及sql进阶教程中的例题)
例1:
第一步:确定各关键点是网页访问顺序中的三个指定要访问的网页
第二步:确定关键点满足的条件是第一个要是A,第二个要是B,第三个要是D
第三步:确定中间的各点需要满足的条件是BD之间不可以是C网页。
例2:
第一步:关键点是连续座位中的开头座位和结束座位
第二步:关键点要满足的条件是:对于开头座位,它必须未预定,并且他前面的座位得是已预定,对于结束座位,它必须是未预定,并且他后面的座位得是已预定
第三点:关键点之间的各点要满足的条件是各个座位都得是未预定。
如果是一个log表,简化起见,这里假设只有一个用户,里面记录了登陆的日期date,而且每个日期都只有一条记录。(如果是有多个用户,只要连接log表的时候加个p1.uid=p2.uid的条件就可以了)要求用户的连续登陆时间段的开头时间和结束时间的话,只要这样就可以了:
select p1.date 'start',p2.date 'end' from log p1,log p2
where p1.date<p2.date
and datediff(day,p1.date,p2.date)=(select count(*) from log p3 where datediff(day,p1.date,p3.date)>=1 and datediff(day,p3.date,p2.date)>=0)
and not exists (select * from log p3 where datediff(day,p3.date,p1.date)=1 or datediff(day,p2.date,p3.date)=1);
第一步:关键点是连续登陆时间中的第一天和最后一天
第二步:关键点要满足的条件是在登陆表中(天然地满足了)以及第一天的前一天不在登陆表中以及第二天的后一天不在登陆表中
第三步:关键点之间的各点要满足的条件是在登陆表中的天数要等于第一天和最后一天的时间间隔
如果要求连续登陆天数,那么只要在这个表的基础上再select一下datediff(day,start,end)就可以了
例3:
第一步:关键点是单增时间段的第一天和最后一天
第二步和第三步这里比较难严格区分,总的来说,要满足的条件是对于处于第一天和最后一天之间的任意两个时间点,后一个时间点的价格总是要比前一个时间点的价格要高。
大概就是这些例题,希望大家看了有帮助。如果中间有错,也请指正,谢谢。(ps,我说的的确不是很清楚,只能意会一下,但的确是秋招0 offer中,没有太多时间详细分享)
#笔试题目#