MYSQL练题笔记-聚合函数-各赛事的用户注册率

一、题目相关内容

1)相关的表

MYSQL练题笔记-聚合函数-各赛事的用户注册率_第1张图片

2)题目

3)帮助理解题目的示例,提供返回结果的格式

MYSQL练题笔记-聚合函数-各赛事的用户注册率_第2张图片

MYSQL练题笔记-聚合函数-各赛事的用户注册率_第3张图片

二、自己初步的理解

有两张不同左右的表,用户表和赛事注册表。然后解题。

1.各种赛事的用户注册百分率

各种赛事的意味着通过contest_id进行分组。

用户注册百分率,我的理解所有用户里面注册这个赛事的百分比,分子其实就是每个赛事参加的用户,也就是分组后的记录数;分母是所有用户数。

或者利用左连接,然后通过avg(case when user_id is not null then +user_id else +0 end)函数算比率。

2.保留2位小数,利用round()。

3.结果按照percentage 降序,相同按照 contest_id,转换成代码就是order by percentage desc,contest_id。

4.加表名

然后我来思考一下,在哪些字段前面加表名。

怀疑case when user_id 要加,变为u.user_id,好吧,测试后+user_id 也要加上u.,就是下面的代码。

Select contest_id,round(avg(case when u.user_id is not null then +u.user_id else +0 end),2)as percentage from users u left join register r on u.user_id=r.user_id group by contest_id order by percentage desc,contest_id;

发现百分率的结果差别,很大,运行结果如下图。

MYSQL练题笔记-聚合函数-各赛事的用户注册率_第4张图片

三、错误后的再次分析

1.计算赛事用户注册百分率出现错误

发现上面的计算方式不对,我不是利用值,是利用记录数。

Count(*)/Count(u.user_id) ,这个结果都是1,但是不是左连接吗?

oh,我找答案算了。下面是我找到的题解。

select contest_id, round(100*count(user_id)/(select count(1) from users),2) as percentage from Register group by contest_id order by 2 desc, 1;

好吧确实是我第一个想法是对的,就是每个赛事参加的用户,也就是分组后的记录数;分母是所有用户数。

分析题解里的count(u.user_id)和count(*):

这里count(1),用count(*)代替也有结果,就是速度不一样。

但是count(u.user_id) 这个是必须的,因为不统计NULL。

2.发现还是出错,他还是设置了一个null的,就是有可能有人什么赛事都没有参加,我又忘记了!!!根本不用左连接就行了,啊啊啊啊啊啊啊啊,而且我才发现我找的都没有连接,下面是我最终通过的答案。

Select contest_id,round(100*count(u.user_id)/(select count(*) from users),2)as percentage from users u join register r on u.user_id=r.user_id group by contest_id order by percentage desc,contest_id;

3.题解与我的不同,所以我也不用连接,而且他的排序用的2,1很有意思,应该就是这张表拍第一的字段和排第二的字段,下面是我修改过后的题解

Select contest_id,round(100*count(user_id)/(select count(*) from users),2)as percentage from register group by contest_id order by percentage desc,contest_id;

四、总结

1.这种计算百分比的,我发现自己还是比较容易出错的

2.到底是连接没理解对,空值存在的情况还是没考虑好。

你可能感兴趣的:(数据库,mysql,笔记,leetcode)