mysql 力扣,1369. 获取最近第二次的活动

  1. 获取最近第二次的活动
    https://leetcode-cn.com/problems/get-the-second-most-recent-activity/
    在这里插入图片描述
    在这里插入图片描述
####提供两种方法,一:
####首先将只有一个人的拿出来,命名为sc这个肯定是答案的一部分。
####其次就组内排序,做降序,取出排名为2的,
####使用mysql的over()函数,或者自己两表合并来做组内排序,这里两种都给了出来,
####命名为two,
####讲下自己写组内排序,就是两表按照username来合并,然后按照某一个表的所有字段做分组。
##这里因为(username,startDate)是唯一字段所以可以使用这两个字段分组,然后将组内的比startDate小的当做1来求和。求和的结果就是组内的排名,这里可以在纸上画画,很好理解的。
with sc as (
    select username ,activity,startDate,endDate from UserActivity 
    group by username
    having count(*)=1),
 two as (
    select *,rank() over(partition by username order by 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 = 2
union
select * from sc

#这个看起来就比较少了,就是自己写的组内排序之后将排名等于2的,和组内只有一个的值给having过滤下,就是这里没有显示给出组内的排序,用的还是组内排序的框架。
select a.* 
from UserActivity a join UserActivity b on a.username = b.username
 group by a.username,a.startDate
 having sum(if(a.startDate<=b.startDate,1,0)) = 2 or count(*) =1```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值