题解 | #9行代码解决# #每个人最近的登录日期(四)#

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

https://www.nowcoder.com/practice/e524dc7450234395aa21c75303a42b0a

提供一个用OVER()和PARTITION的解法,好像还没有人这么写,非常简单方便, 只要9行

思路:

  1. 做一个FROM 的subquery,目的是能够让所有第一次登陆的新用户的排名是1,后期用来筛选:用窗口函数,按照user_id分组,按照日期升序排序。
  2. 按照日期分组,并计算不同日期下排名为1的行数之和
SELECT 
    t.date, 
    SUM(IF(t.r = 1, 1, 0))
FROM(SELECT 
        user_id,
        date,
        ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY date) AS r
    FROM login ) AS t
GROUP BY date

---------------------------------分割线-------------------------------------------------------------

下面还有一个更复杂的方法,只是在外部查询的部分做了改动。

其实下面的方法是一开始想到的,上面的方法算是做了优化

SELECT 
    t1.date,
    COALESCE(t2.cnt, 0) AS cnt
FROM (SELECT DISTINCT date FROM login) AS t1
LEFT JOIN (
    SELECT 
        date, 
        COUNT(*) AS cnt
    FROM (SELECT 
            user_id,
            date,
            ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY date) AS r
        FROM login 
    ) AS t
    WHERE t.r = 1
    GROUP BY date 
) AS t2 
    USING (date)

因为进行WHERE筛选过后,只留下了有新用户的日期。因此我们要再次与日期JOIN,并且将NULL值转化为0

全部评论
膜拜大神!最好的方法!
点赞 回复 分享
发布于 2024-02-21 18:05 北京

相关推荐

1. 多做一劳永逸的事情。很多事情一次学会基本可以大学四年都不再为这类事情发愁。小的比如学会markdown,记笔记就变得方便快捷;大的比如自己经常要发布上线服务,就花几天搭建一个集群。2. 时刻具备3-7天掌握一项技能的心理准备。无论是学科竞赛、期末考试,还是准备实习、秋招,很多时候当你需要快速运用某项技能做事的时候,不会有那么多时间给你准备,这时候就需要速成。3. 加入/组建一个技术团体,社团/面试群/社群/技术博主的圈子,并且养成水群习惯。只有你参与并融入你正在追求的事业的氛围里,你才能保持动力去做一件事。推荐一个博主【程序员牛肉】的圈子:https://pd.qq.com/s/daelsgft54. 尽早明确自己距离目标还差什么。很多人学习的非常努力,但是方向不明确。最简单的例子,很多我帮忙找实习秋招的朋友,简历都过不了,却花大把时间在背八股上。面试的过程是阶段性的,要考虑的先是有面试机会、再是怎么面试。5. 思维不要被约束。后端语言java、c++可以,golang也可以;项目苍穹外卖、黑马点评可以,github上的高star项目也可以;数据库用mysql、redis可以,用postgresql也可以;项目里的ai模块用rag、mcp可以,最简单的function call也可以。帮很多人看简历问题的时候,很多东西都是硬写上去的,项目是自己的,不是非要和网上大流一致才是好项目。
想进开水团喝开水:杭电也是双非是吧
点赞 评论 收藏
分享
狸猫换offer:埋点都出来了
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务