题目复盘——聚合分组查询
题源牛客网——记录一下自己的学习
SQL14 得分求截断平均值
截断平均值:去掉一个最大值和一个最小值后的平均值。
问题分析
(1)条件拆分:SQL类别+高难度————用WHERE限制;
(2)数据计算:去掉最大最小值————首先想到了排序之后LIMIT再AVG这样反而麻烦了————用(SUM-MAX-MIN)/COUNT最简洁;
(3)用户答题与难度类别对应起来————用JOIN ON内联结;
(4)结果保留一位小数————用ROUND(,1);
答案重写
SELECT tag,difficulty,
ROUND(((SUM(score)-MAX(score)-MIN(score)))/(COUNT(score)-2),1) clip_avg_score
FROM examination_info e_i
JOIN exam_record e_r ON e_i.exam_id=e_r.exam_id
WHERE tag='SQL' AND difficulty='hard';
细节问题
(1)最后示例输出中,完全没注意到保留几位小数的问题,也就没想到round(,);
(2)输入错误,出现列名英文输错的情况,应避免!
新知识
(1)JOIN…USING
using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件;多表查询就使用多个这样的join。
SELECT mm,nn FROM a_i
LEFT JOIN b_i USING(colA)
LEFT JOIN c_i USING(colB);
要求colA在a_i,b_i中均存在,colB在a_i,c_i表中均存在。
SQL15 统计作答次数
问题分析
(1)总作答次数————COUNT(start_time)或者COUNT(*)只要选择不忽略NULL的COUNT即可;
(2)试卷已完成作答次数————COUNT(submit_time) 指定列名会忽视空值;
(3)已完成试卷数————COUNT(DISTINCT IF(score IS NOT NULL,exam_id,NULL))去除重复项统计,一个试卷可以被很多人做过,并且去掉空值未提交的!
答案重写
SELECT COUNT(start_time) total_pv,
COUNT(submit_time<