当前位置: 首页 > news >正文

SQL176 每个题目和每份试卷被作答的人数和次数

描述

现有试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

iduidexam_idstart_timesubmit_timescore
1100190012021-09-01 09:01:012021-09-01 09:41:0181
2100290022021-09-01 12:01:012021-09-01 12:31:0170
3100290012021-09-01 19:01:012021-09-01 19:40:0180
4100290022021-09-01 12:01:012021-09-01 12:31:0170
5100490012021-09-01 19:01:012021-09-01 19:40:0185
6100290022021-09-01 12:01:01(NULL)(NULL)

题目练习表practice_record(uid用户ID, question_id题目ID, submit_time提交时间, score得分):

iduidquestion_idsubmit_timescore
1100180012021-08-02 11:41:0160
2100280012021-09-02 19:30:0150
3100280012021-09-02 19:20:0170
4100280022021-09-02 19:38:0170
5100380012021-08-02 19:38:0170
6100380012021-08-02 19:48:0190
7100380022021-08-01 19:38:0180

请统计每个题目和每份试卷被作答的人数和次数,分别按照"试卷"和"题目"的uv & pv降序显示,示例数据结果输出如下:

tiduvpv
900133
900213
800135
800222

解释:“试卷”有3人共练习3次试卷9001,1人作答3次9002;“刷题”有3人刷5次8001,有2人刷2次8002

SELECTexam_id AS tid,COUNT(DISTINCT exam_record.uid) uv,COUNT(*) pv
FROMexam_record
GROUP BYexam_id
UNION
SELECTquestion_id AS tid,COUNT(DISTINCT practice_record.uid) uv,COUNT(*) pv
FROMpractice_record
GROUP BYquestion_id
ORDER BYLEFT(tid, 1) DESC,uv DESC,pv DESC;

🔍 分步拆解与核心知识点

🧱 第一部分:考试行为统计(Exam UV/PV)

SELECTexam_id AS tid,COUNT(DISTINCT uid) AS uv,COUNT(*) AS pv
FROM exam_record
GROUP BY exam_id
字段说明
exam_id AS tid统一别名为 tid(目标 ID),便于合并
COUNT(DISTINCT uid)计算该试卷的独立用户数(UV)
COUNT(*)总作答次数(PV)
GROUP BY exam_id按试卷分组统计

🧱 第二部分:练习行为统计(Question UV/PV)

SELECTquestion_id AS tid,COUNT(DISTINCT uid) AS uv,COUNT(*) AS pv
FROM practice_record
GROUP BY question_id

结构与第一部分完全一致,只是数据源不同。


🧱 合并:UNION

-- 第一个查询
...
UNION
-- 第二个查询
  • ✅ UNION 将两个结构相同的查询结果纵向拼接
  • 要求:各列类型和顺序必须一致(这里都是 tiduvpv
  • 自动去重(如用 UNION ALL 则不去重)

🧱 排序:ORDER BY LEFT(tid, 1) DESC, uv DESC, pv DESC

ORDER BYLEFT(tid, 1) DESC,  -- 按 tid 的第一个字符降序uv DESC,pv DESC
http://www.dtcms.com/a/324599.html

相关文章:

  • 力扣(H指数)
  • Mysql 8.0 新特性
  • 以太网相关协议
  • C/C++数据结构之双向链表
  • scala 样例类
  • Spring的三层架构及其各个层用到注解详细解释。
  • 零基础学Java第三讲---运算符
  • android 使用openimagelib OpenImage 实现点击放大图片,浏览
  • 【Docker实战】Spring Boot应用容器化
  • 蓝牙认证流程:BQB 测试、互操作性验证与品牌授权指南 —— 面试高频考点与历年真题解
  • Bean的实例化方式
  • WinForm之TreeView控件
  • 深入解析React Diff 算法
  • 基于 InfluxDB 的服务器性能监控系统实战(三)
  • Windchill 11.0使用枚举类型自定义实用程序实现角色管理
  • Web API开发中的数据传输:MIME类型配置与编码最佳实践
  • vulnhub-Doubletrouble靶机
  • 医学统计(随机对照研究分类变量结局数据的统计策略3)
  • AI正自我觉醒!
  • C4.5算法:增益率(Gain Ratio)
  • 洛谷 P2404 自然数的拆分问题-普及-
  • 3.3keep-alive
  • Windows11 [Close Folder Shortcut]
  • vue2升级vue3:单文件组件概述 及常用api
  • Android Intent 解析
  • 【Linux】通俗易懂讲解-正则表达式
  • 从Redisson源码角度深入理解Redis分布式锁的正确实现
  • JetPack系列教程(三):Lifecycle——给Activity和Fragment装个“生命探测仪“
  • redis主从模型与对象模型
  • Beelzebub靶机练习