牛客每个人最近的登录日期(六)题解

牛客每个人最近的登录日期(六)

http://www.nowcoder.com/questionTerminal/572a027e52804c058e1f8b0c5e8a65b4

select user_id,date,sum(number) over(partition by user_id order by date) from passing_number
select pn1.user_id,pn1.date,sum(pn2.number) 
from passing_number pn1,passing_number pn2 where pn1.user_id=pn2.user_id and pn1.date>=pn2.date 
group by pn1.user_id,pn1.date;
这2种方法,均可以得到某一天,id为多少的用户,在这一天和这一天之前,通过的题目总数,id和日期,然后和登录(login)表,用户(user)表连接,再按照题目要求的东西排序,就可以得到最后的结果了:
select user.name as u_n, login.date, p1.ps_num
from login 
join (select user_id, date ,sum(number) over(partition by user_id order by date) ps_num from passing_number) p1
on p1.user_id=login.user_id and p1.date=login.date
join user on login.user_id=user.id
order by login.date, user.name
与以下语句等价:
select user.name as u_n, login.date, p1.ps_num
from login 
join (select pn1.user_id,pn1.date,sum(pn2.number) as ps_num
from passing_number pn1,passing_number pn2 where pn1.user_id=pn2.user_id and pn1.date>=pn2.date 
group by pn1.user_id,pn1.date) p1
on p1.user_id=login.user_id and p1.date=login.date
join user on login.user_id=user.id
order by login.date,user.name;




全部评论
第一种解法比较高明。用user_id和date共同来分组,保留了每一行记录,效果和partition一样。也让我学到了新的group by 的用法!谢谢。 就是有一点疑问:用group by分组以后,聚合函数SUM()应该是对每个分组进行计算,为什么也能响应where条件中的pn1.date>=pn2.date进行求和,这好像已经是跨分组间的求和了……这个不是很理解。 难道是因为group by仅对pn1进行了分组,而没有对pn2进行分组?如果这样的话SUM(pn2.number)应该等于pn2中number列所有值的和啊……
点赞 回复 分享
发布于 2021-03-02 21:10
搞明白了,where条件是针对pn2的,可以对未分组的pn2限定条件
点赞 回复 分享
发布于 2021-03-02 21:54
感觉得这一题的题目有问题,login表是不需要的,因为题目已经说明只需要刷过题的客户,而刷过题的客户无论是否有通过那都是已经登录过的,这个在题目中已经说明,没登陆过的是不能刷题的.那么就只需要在passing_number表里取数然后再连接user表.当然如果题目改一下,只要登陆过的客户无论是否刷题都要显示出来,那才需要连接login表.
点赞 回复 分享
发布于 2021-04-13 16:41
select b.name,a.date, sum(case when a.date>=(select date from passing_number c where a.user_id=c.user_id) then a.number else 0 end) as number from passing_number a,user b where a.user_id=b.id group by a.user_id,a.date;救救我愚蠢的代码
点赞 回复 分享
发布于 2022-09-22 11:12 黑龙江

相关推荐

评论
24
3
分享

创作者周榜

更多
牛客网
牛客企业服务