膜拜大神!最好的方法!
提供一个用OVER()和PARTITION的解法,好像还没有人这么写,非常简单方便, 只要9行思路:做一个FROM 的subquery,目的是能够让所有第一次登陆的新用户的排名是1,后期用来筛选:用窗口函数,按照user_id分组,按照日期升序排序。按照日期分组,并计算不同日期下排名为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 tGROUP BY date---------------------------------分割线-------------------------------------------------------------下面还有一个更复杂的方法,只是在外部查询的部分做了改动。其实下面的方法是一开始想到的,上面的方法算是做了优化SELECT     t1.date,    COALESCE(t2.cnt, 0) AS cntFROM (SELECT DISTINCT date FROM login) AS t1LEFT 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
点赞 3
评论 1
全部评论

相关推荐

强大的马里奥:不太可能,我校计算机硕士就业率99%
点赞 评论 收藏
分享
那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
就在我现在公司的隔壁每天经过都唏嘘不已(就是羡慕)什么时候可以到这里上班啊
柯基在debug:从大学毕业投简历到现在了,应届的时候我都面到终面了,现在工作四年了连简历初筛都过不了了
投递莉莉丝游戏等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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