牛客在线编程练习:SQL69_较难

SQL练习:SQL69_较难


题目: 查询每个日期登录新用户个数,并且查询结果按照日期升序排序。

在这里插入图片描述
在这里插入图片描述

题解:

# 方式1:窗口函数ROW_NUMBER+CASE语句
# 思路:给每个用户分区,选出编号为1与对应日期的记录,CASE函数做判断后SUM
SELECT A.date,SUM(
    CASE
    WHEN t_rank = 1 THEN 1 # 编号为1的是用户新登录
    ELSE 0 # 其他编号的是用户再次登录
    END)
FROM (SELECT date,ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY date) AS t_rank
     FROM login) AS A
GROUP BY A.date
## PARTITION BY:把user_id分区,这里类似GROUP BY,但要清楚他们不是等同的。

# 方式2:CASE语句
# 思路:日期分组,SUM用户新登录的记录
SELECT date,SUM(CASE
                WHEN (user_id,date) IN (
                    SELECT user_id,MIN(date)
                    FROM login
                    GROUP BY user_id) THEN 1 # 若当前日期是用户新登录时间,赋值为1
                ELSE 0 # 否则为0
                END)
FROM login
GROUP BY date
ORDER BY date

# 方式3:IFNULL函数,这个方式比较复杂,不建议使用
# 思路:直接统计出每日用户新登录的记录,若无记录则置为0
SELECT A.date,IFNULL(n1.new_num,0) # 配合外连接的特性,无记录则为显示0
FROM login A
LEFT JOIN(SELECT B.date,COUNT(DISTINCT B.user_id) AS new_num # 算出每日用户新登录的记录数
          FROM login B
          WHERE B.date = (SELECT MIN(date) # 新登录时间
                           FROM login
                           WHERE user_id = B.user_id)
          GROUP BY B.date) n1 ON A.date = n1.date
GROUP BY A.date
ORDER BY A.date
  • 个人整理的笔记,仅供学习使用,有问题麻烦指正。
  • 题目来源于:牛客网
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值