〇、今日内容概述

一、聚合函数

1、SQL类别高难度试卷得分的截断平均值【去最高最低分求平均】

  • 自己的想法

    SELECT tag, difficulty, ROUND((SUM(score)-MIN(score)-MAX(score))/(COUNT(score)-2),1) AS clip_avg_score FROM examination_info,exam_record WHERE examination_info.exam_id=exam_record.exam_id AND tag='hard' AND tag='SQL'

  • 报错:

    Execution Error SQL_ERROR_INFO: "In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'examination_info.difficulty'; this is incompatible with sql_mode=only_full_group_by"

  • 正确做法

    SELECT tag, difficulty, ROUND((SUM(score)-MIN(score)-MAX(score))/(COUNT(score)-2),1) AS clip_avg_score FROM examination_info JOIN exam_record USING(exam_id) WHERE tag='SQL' AND difficulty='hard'



    SELECT tag, difficulty, ROUND((SUM(score)-MIN(score)-MAX(score))/(COUNT(score)-2),1) AS clip_avg_score FROM examination_info,exam_record WHERE examination_info.exam_id=exam_record.exam_id AND difficulty='hard' AND tag='SQL'

2、统计作答次数

  • 自己的想法

    SELECT COUNT(*) AS total_pv, SUM((CASE WHEN score IS NULL AND submit_time IS NULL THEN 0 ELSE 1 )) AS complete_pv, COUNT(DISTINCT exam_id) AS complete_exam_cnt FROM exam_record
  • 报错

    Execution Error SQL_ERROR_INFO: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')) AS complete_pv,\n COUNT(DISTINCT exam_id) AS complete_exam_cnt\nFROM exam_re' at line 7"
  • 正确做法

    SELECT COUNT(*) AS total_pv, SUM((CASE WHEN score IS NULL AND submit_time IS NULL THEN 0 ELSE 1 END )) AS complete_pv, COUNT(DISTINCT exam_id AND score IS NOT NULL AND submit_time IS NOT NULL) AS complete_exam_cnt FROM exam_record
  • 原因:CASE ... WHEN ... THEN ... END
  • 方法2:使用IF

    SELECT COUNT(*) AS total_pv, SUM((CASE WHEN score IS NULL AND submit_time IS NULL THEN 0 ELSE 1 END )) AS complete_pv, COUNT(DISTINCT IF(score IS NOT NULL, exam_id, NULL)) AS complete_exam_cnt FROM exam_record

3、得分不小于平均分的最低分

  • 分组的可以在分组内使用join



  • 自己的思路
点击查看代码
SELECT
MIN(score) AS min_score_over_avg
FROM exam_record A
JOIN examination_info B
JOIN (SELECT exam_id,AVG(score) AS ex_score
FROM exam_record
GROUP BY exam_id) AVG_E
USING exam_id
WHERE
score<ex_score
AND
tag='SQL'

* 正确答案

点击查看代码
SELECT
MIN(score) AS min_score_over_avg
FROM exam_record er
JOIN examination_info ei
ON er.exam_id=ei.exam_id
WHERE
tag='SQL'
AND score>=
(SELECT AVG(score)
FROM exam_record er
WHERE
tag='SQL'
AND
er.exam_id=ei.exam_id
GROUP BY er.exam_id)

* 方法2:使用over函数☆
# 二、分组函数
## 1、平均**活跃天数**和月活人数

  • 自己写的
点击查看代码
SELECT
DATE_FORMAT(submit_time,"%Y%m") AS month,
ROUND(SUM(IF(submit_time IS NOT NULL,1,0))/COUNT(DISTINCT uid),2) AS avg_active_days,
COUNT(DISTINCT uid) AS mau
FROM exam_record
WHERE
submit_time IS NOT NULL
AND
YEAR(submit_time)='2021'
GROUP BY month

* 陷阱在于九月份有个用户同一天做了两种卷子,直接count统计的话活跃天数会多一天,即用户ID和做题日期submit_time要同时去重才能得出正确的活跃天数.
* 正确答案

点击查看代码
SELECT
DATE_FORMAT(submit_time,"%Y%m") AS month,
ROUND(COUNT(DISTINCT uid,DATE_FORMAT(submit_time,"%Y%m%d"))/COUNT(DISTINCT uid),2) AS avg_active_days,
COUNT(DISTINCT uid) AS mau
FROM exam_record
WHERE
submit_time IS NOT NULL
AND
YEAR(submit_time)='2021'
GROUP BY month

## 2、月总刷题数和日均刷题数【拼接未知数据使用UNION】

  • 自己写的【错误】:
点击查看代码
SELECT
DATE_FORMAT(submit_time,"%Y%m") AS submit_month,
COUNT(submit_time) AS month_q_cnt,
ROUND(COUNT(submit_time)/(
CASE
WHEN MONTH(submit_time)=1 THEN 31
WHEN MONTH(submit_time)=2 THEN 28
WHEN MONTH(submit_time)=3 THEN 31
WHEN MONTH(submit_time)=4 THEN 30
WHEN MONTH(submit_time)=5 THEN 31
WHEN MONTH(submit_time)=6 THEN 30
WHEN MONTH(submit_time)=7 THEN 31
WHEN MONTH(submit_time)=8 THEN 31
WHEN MONTH(submit_time)=9 THEN 30
WHEN MONTH(submit_time)=10 THEN 31
WHEN MONTH(submit_time)=11 THEN 30
WHEN MONTH(submit_time)=12 THEN 31
END
),3) AS avg_day_q_cnt
FROM practice_record
WHERE
submit_time IS NOT NULL
AND
YEAR(submit_time)=2021
GROUP BY submit_month
ORDER BY submit_month ASC
  • 正确答案
点击查看代码
SELECT
DATE_FORMAT(submit_time,"%Y%m") submit_month,
COUNT(submit_time) month_q_cnt,
ROUND(COUNT(submit_time)/MAX(DAY(LAST_DAY(submit_time))),3) avg_day_q_cnt
-- 使用max实现去重
FROM practice_record
WHERE YEAR(submit_time)=2021
GROUP BY submit_month
UNION ALL
SELECT
"2021汇总" submit_month,
COUNT(submit_time) month_q_cnt,
ROUND(COUNT(submit_time)/31,3) avg_day_q_cnt
FROM practice_record
WHERE YEAR(submit_time)=2021
ORDER BY submit_month ASC

3、未完成试卷数大于1的有效用户

点击查看代码
SELECT
uid,
SUM(IF(er.submit_time IS NULL,1,0)) AS incomplete_cnt,
-- COUNT(CASE WHEN er.submit_time IS NULL THEN er.start_time ELSE NULL END) AS incomplete_cnt,
SUM(IF(er.submit_time IS NOT NULL,1,0)) AS complete_cnt,
**GROUP_CONCAT(DISTINCT CONCAT_WS(':',DATE_FORMAT(er.start_time,"%Y-%m-%d"),ei.tag) SEPARATOR ';') **AS detail
FROM exam_record er
LEFT JOIN examination_info ei
ON er.exam_id=ei.exam_id
WHERE YEAR(er.start_time)=2021
GROUP BY er.uid
HAVING
complete_cnt>=1
AND
incomplete_cnt<5
AND
incomplete_cnt>1
ORDER BY incomplete_cnt DESC

【SQL进阶】【CASE/IF、COUNT/SUM、多条记录拼接为一个内容】Day03:聚合分组查询的更多相关文章

  1. LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg

    LINQ  to SQL 语句(3) 之  Count/Sum/Min/Max/Avg [1] Count/Sum 讲解 [2] Min 讲解 [3] Max 讲解 [4] Average 和 Agg ...

  2. oracle通过sql随机取表中的10条记录

    oracle通过sql随机取表中的10条记录: SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE Row ...

  3. LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg

    适用场景:统计数据吧,比如统计一些数据的个数,求和,最小值,最大值,平均数. Count 说明:返回集合中的元素个数,返回INT类型:不延迟.生成SQL语句为:SELECT COUNT(*) FROM ...

  4. SQL 父子表,显示表中每条记录所在层级

    1.sqlserer 中有一张父子关系表,表结构如下: CREATE TABLE [dbo].[testparent]( [ID] [int] IDENTITY(1,1) NOT NULL, [nam ...

  5. MYSQL实现列拼接,即同一个字段,多条记录拼接成一条

    一.首先,新建三张表 DROP TABLE IF EXISTS `article`; CREATE TABLE `article` ( `id` ) unsigned NOT NULL AUTO_IN ...

  6. 每天努力一点之SQL(二) count sum case when then group by

    1. select sum(CASE WHEN A.[STATUS]=0 THEN 1 ELSE 0 end) as a1,  sum(CASE A.[STATUS] WHEN 1 THEN 1 EL ...

  7. SQL —— 获取重复某个字段的第一条记录

    ----------用来双重排序,且获取唯一 go SELECT ROW_NUMBER() OVER (ORDER BY AScore DESC,ATime ASC) AS Rank, * FROM ...

  8. 一条sql获取每个类别最新的一条记录

    1.初始化数据 create table Products ( id ,), name ), categroy int, addtime datetime , ) insert into Produc ...

  9. SQL学习笔记:选取第N条记录

    Northwind数据库,选取价格第二高的产品. 有两种方法,一个是用Row_Number()函数: SELECT productname FROM ( productname, Row_Number ...

  10. sql 更新重复数据只取一条记录

    select s.*  from (     select *, row_number() over (partition by PersonnelAccount order BY Personnel ...

随机推荐

  1. Kubernetes Operator: Operator

    Operator 就可以看成是 CRD 和 Controller 的一种组合特例,Operator 是一种思想,它结合了特定领域知识并通过 CRD 机制扩展了 Kubernetes API 资源,使用 ...

  2. SonarQube 插件之 Issues Report & SonarLint 的配置及使用

    转载自:https://cloud.tencent.com/developer/article/1010599 1.Issues Report Plugins 介绍 使用 Issues Report ...

  3. linux安装node和达梦数据库8

    PS.本次测试只是为了项目需要,但是在部署和启动程序的时候发生了一系列的报错,由此记录下来为日后作参考 安装达梦数据库 1. 达梦数据库(DM8)简介 达梦数据库管理系统是武汉达梦公司推出的具有完全自 ...

  4. Opengl ES之纹理贴图

    纹理可以理解为一个二维数组,它可以存储大量的数据,这些数据可以发送到着色器上.一般情况下我们所说的纹理是表示一副2D图,此时纹理存储的数据就是这个图的像素数据. 所谓的纹理贴图,就是使用Opengl将 ...

  5. MySQL数据库-数据表(上)

    数据表的基本操作. MySQL 数据库支持多种数据类型,大致可以分为 3 类:数值类型.日期和时间类型.字符串(字符)类型. (1)数值类型 数值类型用于存储数字型数据,这些类型包括整数类型(TINY ...

  6. 原生Redis跨数据中心双向同步优化实践

    一.背景 公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度.需要保证多数据中心容灾或者实现用户就近访问的话,需要各个数据中心拥 ...

  7. 聊聊Vim的工作原理

    聊聊Vim的工作原理 日常里一直在用Vim这个编辑器,前阵子学习关于Linux中的fd(文件描述符)时,发现vim的进程描述符会比上一个自动加一,后续了解到vim的工作原理后,解开了这个疑问,所以记录 ...

  8. rowkey设计原则和方法

    rowkey设计首先应当遵循三大原则: 1.rowkey长度原则 rowkey是一个二进制码流,可以为任意字符串,最大长度为64kb,实际应用中一般为10-100bytes,它以byte[]形式保存, ...

  9. git clone开启云上AI开发

    摘要:相比于传统的软件开发,AI开发存在以下4个痛点:算法繁多:训练时间长:算力需求大:模型需手动管理,我们可以使用云上AI开发的方式来缓解以上4个痛点. 本文分享自华为云社区<git clon ...

  10. 说说 Redis pipeline

    更多技术文章,请关注我的个人博客 www.immaxfang.com 和小公众号 Max的学习札记. Redis 客户端和服务端之间是采用 TCP 协议进行通信的,是基于 Request/Respon ...