leetcode刷MySQL记录——sum/count里加条件判断、avg求满足条件记录数占比

leetcode题目:1934. 确认率

在刷leetcode的MySQL题中,从题目的题解知道了count和avg聚合函数的另外用法,在此记录。

count() 里加条件判断

count函数用于统计在符合搜索条件的记录中,指定的表达式expr不为NULL的行数有多少(只要不为NULL都会进行统计)。这里需要特别注意的是,expr不仅仅可以是列名,其他任意表达式都是可以的。

还看到一篇文章说,在MySQL里,count(*) 会把*变为0,即count(0),而0不等于NULL,所以相当于记录表中的总记录数。

刚开始一直弄不明白题解的答案,经过不断尝试后,知道了count的实际运行效果,如下

复制代码
count(age > 10)  
    -> 不管条件成不成立,都会用age的实际值去计数,只要age不为null都会累计
count(age > 10 or null) 
    -> 符合条件,用age的实际值去计数,只要age不为null都会累计
    -> 不符合条件,则取or后跟的值,这里为null,即count(null),count对null不计数
count(1) / count(null) 
    -> 出现除以0的非法情况,结果会返回null
sql 复制代码
-- 统计年龄大于19岁的用户人数
-- 以下三种写法等价
select count(age <  19 or null) from user 
select count(if(age <  19, 1, null)) from user 
select count(case when age <  19 then 1 end) from user 

avg() 求符合条件的记录数占比

AVG除了可以计算某字段的均值外,还可以计算符合条件的记录数占比,AVG(判断条件) = 满足"判断条件"为True的记录数 / 总记录数,即每个user_id分组中满足"action = 'confirmed'"的行数占该组总行数的比例

sum()函数里加条件判断

sql 复制代码
# Write your MySQL query statement below
select a.user_id,
round(sum(if (b.action='confirmed',1.00,0.00)) / count(a.user_id), 2) as confirmation_rate 
from Signups a left join Confirmations b on a.user_id = b. user_id
group by a.user_id

参考:

必看!大家困惑的AVG写法的解释!简单易懂!

【确认率】使用count()函数并添加筛选条件

sum+iif 题解

Mysql count 带条件计数

MySQL Count函数使用教程

相关推荐
sc.溯琛6 分钟前
MySQL 入门实验:环境搭建与基础操作全攻略
数据库·mysql
徐子童9 分钟前
索引的分类和创建
mysql·面试·基础·索引
季远迩16 分钟前
LeetCode 热题 100 Python3易懂题解(更新中)
算法·leetcode·哈希算法
麦麦鸡腿堡20 分钟前
MySQL表的操作指令与常用数值类型
数据库·mysql
蜂蜜黄油呀土豆21 分钟前
MySQL 什么情况下会产生死锁?为什么会死锁?以及 Online DDL 解决了什么问题
mysql·innodb·间隙锁·数据库原理·next-key lock·死锁分析
Dream it possible!34 分钟前
LeetCode 面试经典 150_回溯_组合(99_77_C++_中等)
c++·leetcode·面试·回溯
好易学·数据结构1 小时前
可视化图解算法74:最小花费爬楼梯
数据结构·算法·leetcode·动态规划·力扣
Maỿbe2 小时前
力扣hot图论部分
算法·leetcode·图论
LYFlied2 小时前
【每日算法】LeetCode 78. 子集
数据结构·算法·leetcode·面试·职场和发展
月明长歌2 小时前
【码道初阶】【Leetcode606】二叉树转字符串:前序遍历 + 括号精简规则,一次递归搞定
java·数据结构·算法·leetcode·二叉树