力扣sql练习题-确定率

173 阅读2分钟

题目:确认率

要求:

用户的 确认率 是 'confirmed' 消息的数量除以请求的确认消息的总数。没有请求任何确认消息的用户的确认率为 0 。确认率四舍五入到 小数点后两位 。

编写一个SQL查询来查找每个用户的 确认率 。

以 任意顺序 返回结果表。

查询结果格式如下所示。

确定率.png

使用到的方法:if / left join /group by

解题思路:

1、需要以Signups为主表进行连接后进行求解 2、使用round()函数返回两位小数 3、使用if函数对action进行判断,返回1,或0,确认率= confirmed次数/总行数,此处需要注意,连接后没有登录的用户confirmed的计数也为0,在if(b.action="confirmed",1,0) 判断条件中进行了处理

题解:

select a.user_id,round(sum(if(b.action="confirmed",1,0))/count(a.user_id),2) confirmation_rate from Signups a left join Confirmations b on a.user_id =b.user_id group by a.user_id

大佬题解:

看到比率问题,直接想到avg求平均值的方法,刚开始自己也想到了ifnull,但是不太会使用,下面看看大佬是怎么解题的

解析:

  1. 通过round函数来保存两位小数
  2. 通过avg来判断 AVG(c.action = 'confirmed')的平均值,这样就不用手动计算
  3. 通过ifnull判断,如果AVG(c.action = 'confirmed')为null,那么就是0
SELECT
    s.user_id,
    ROUND(IFNULL(AVG(c.action = 'confirmed'),0),2) AS confirmation_rate
FROM Signups s
LEFT JOIN Confirmations c
    ON s.user_id = c.user_id
GROUP BY s.user_id

记录一下sum和count的区别:

count(条件表达式),不管记录是否满足条件表达式,只要非NULL就加1,这里有一个坑,如果是在左右连接中,例如以坐表为主表,计算右表的count值,那么直接统计count(*)是不行的,因为有的字段为null,所以要统计右表的字段值,那么为null的字段也会进行统计。

sum(条件表达式),只有记录满足条件表达式,才加1。