####提供两种方法,一:####首先将只有一个人的拿出来,命名为sc这个肯定是答案的一部分。####其次就组内排序,做降序,取出排名为2的,####使用mysql的over()函数,或者自己两表合并来做组内排序,这里两种都给了出来,####命名为two,####讲下自己写组内排序,就是两表按照username来合并,然后按照某一个表的所有字段做分组。##这里因为(username,startDate)是唯一字段所以可以使用这两个字段分组,然后将组内的比startDate小的当做1来求和。求和的结果就是组内的排名,这里可以在纸上画画,很好理解的。with sc as(select username ,activity,startDate,endDate from UserActivity
groupby username
havingcount(*)=1),
two as(select*,rank()over(partitionby username orderby startDate desc)'rankx'from UserActivity
)-- two as (-- select a.* ,sum(if(a.startDate<=b.startDate,1,0)) 'rankx'-- from UserActivity a join UserActivity b on a.username = b.username-- group by a.username,a.startDate-- )select username ,activity,startDate,endDate from two where rankx =2unionselect*from sc
#这个看起来就比较少了,就是自己写的组内排序之后将排名等于2的,和组内只有一个的值给having过滤下,就是这里没有显示给出组内的排序,用的还是组内排序的框架。select a.*from UserActivity a join UserActivity b on a.username = b.username
groupby a.username,a.startDate
havingsum(if(a.startDate<=b.startDate,1,0))=2orcount(*)=1```