SQL 多表关联与分组聚合:解密答题正确率分析

一、问题拆解:从业务需求到SQL逻辑

1.1 需求分析

题目要求:计算浙江大学用户在不同难度题目下的答题正确率,并按正确率升序排序。

关键分析点

  1. 数据来源
    • user_profile:存储用户信息(大学)
    • question_practice_detail:存储答题记录
    • question_detail:存储题目难度信息
  2. 筛选条件university = '浙江大学'
  3. 计算逻辑
    • 正确率 = 正确答题数 / 总答题数
    • 需按题目难度分组(difficult_level
  4. 结果要求:按正确率升序排列

1.2 示例数据与预期结果

假设各表结构及部分数据:

user_profile

device_iduniversity
1001浙江大学
1002浙江大学
1003复旦大学

question_practice_detail

device_idquestion_idresult
1001Q101right
1001Q102wrong
1002Q102right
1002Q103right

question_detail

question_iddifficult_level
Q101hard
Q102medium
Q103easy

预期结果

difficult_levelcorrect_rate
medium0.5000
hard1.0000
easy1.0000

二、核心SQL解析:多表关联与聚合计算

2.1 完整SQL语句

SELECT qd.difficult_level, ROUND(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END) / COUNT(qpd.question_id), 4) AS correct_rate
FROM user_profile AS up
INNER JOIN question_practice_detail AS qpd ON up.device_id = qpd.device_id
INNER JOIN question_detail AS qd ON qpd.question_id = qd.question_id
WHERE up.university = '浙江大学'
GROUP BY qd.difficult_level
ORDER BY correct_rate ASC;

2.2 关键技术点分解

1. 三表关联策略
user_profile INNER JOIN question_practice_detail INNER JOIN question_detail
  • 作用
    • 通过device_id关联用户与答题记录
    • 通过question_id关联答题记录与题目难度
  • 选择内连接的原因
    • 仅统计实际答题的用户和题目
    • 排除未答题用户或无难度信息的题目
2. 正确率计算逻辑
ROUND(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END) / COUNT(qpd.question_id), 4)
  • 分子SUM(CASE ...)统计正确答题数
  • 分母COUNT(qpd.question_id)统计总答题数
  • ROUND函数:保留四位小数
3. 分组与排序
GROUP BY qd.difficult_level
ORDER BY correct_rate ASC
  • 分组:按题目难度(difficult_level)分组
  • 排序:按计算出的正确率升序排列

三、SQL语法精讲

3.1 多表连接语法

table1 [INNER|LEFT|RIGHT] JOIN table2 ON condition1
[INNER|LEFT|RIGHT] JOIN table3 ON condition2
  • 本例连接类型:内连接(INNER JOIN)
  • 执行顺序:从左到右依次连接各表

3.2 聚合函数详解

函数作用
SUM(expr)计算表达式的总和
COUNT(expr)统计非NULL值的数量
ROUND(num, dec)将数值四舍五入到指定小数位数

3.3 CASE表达式

CASE WHEN condition THEN value ELSE default_value 
END
  • 本例应用:将布尔条件(result='right')转换为数值(1或0)

四、执行流程与数据流转

4.1 分步执行过程

步骤1:筛选浙江大学用户

WHERE up.university = '浙江大学'
  • 结果:保留user_profile中浙江大学的用户记录

步骤2:连接答题记录表

INNER JOIN question_practice_detail AS qpd 
ON up.device_id = qpd.device_id
  • 结果
    device_iduniversityquestion_idresult
    1001浙江大学Q101right
    1001浙江大学Q102wrong
    1002浙江大学Q102right
    1002浙江大学Q103right

步骤3:连接题目难度表

INNER JOIN question_detail AS qd 
ON qpd.question_id = qd.question_id
  • 结果
    device_iduniversityquestion_idresultdifficult_level
    1001浙江大学Q101righthard
    1001浙江大学Q102wrongmedium
    1002浙江大学Q102rightmedium
    1002浙江大学Q103righteasy

步骤4:分组与聚合计算

  1. 按难度分组
    • hard:Q101(1条记录,1正确)
    • medium:Q102(2条记录,1正确)
    • easy:Q103(1条记录,1正确)
  2. 计算正确率
    • hard:1/1 = 1.0000
    • medium:1/2 = 0.5000
    • easy:1/1 = 1.0000

步骤5:排序

ORDER BY correct_rate ASC
  • 最终结果:按正确率升序排列

五、性能优化策略

5.1 索引优化

-- 为user_profile添加索引
CREATE INDEX idx_university_device ON user_profile(university, device_id);-- 为question_practice_detail添加复合索引
CREATE INDEX idx_device_question ON question_practice_detail(device_id, question_id, result);-- 为question_detail添加索引
CREATE INDEX idx_question_difficulty ON question_detail(question_id, difficult_level);

5.2 执行计划分析

使用EXPLAIN关键字分析执行计划:

EXPLAIN
SELECT ... (SQL) ...;

关键指标解读

  • type列:期望各表连接类型为refeq_ref
  • key列:应显示使用了上述创建的索引
  • Extra列:避免出现Using filesortUsing temporary

六、常见问题与解决方案

6.1 除数为零问题

问题:若某难度题目无人作答,COUNT(qpd.question_id)为0,导致除零错误。
解决方案

-- 使用NULLIF防止除零
ROUND(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END) / NULLIF(COUNT(qpd.question_id), 0), 4)-- 若存在无答题记录的难度,需改用LEFT JOIN并处理NULL

6.2 正确率精度问题

问题:直接相除可能导致精度丢失。
解决方案

-- 显式转换为DECIMAL类型
ROUND(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END) / COUNT(qpd.question_id), 4) AS correct_rate

6.3 多表连接性能问题

问题:大数据量下多表连接可能性能较差。
解决方案

  1. 确保连接字段都有索引
  2. 优先过滤数据(如先筛选浙江大学用户)
  3. 考虑使用临时表存储中间结果

七、扩展应用:分组聚合的进阶场景

7.1 计算各大学平均正确率

SELECT up.university,ROUND(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END) / COUNT(qpd.question_id), 4) AS avg_correct_rate
FROM ...
GROUP BY up.university
ORDER BY avg_correct_rate DESC;

7.2 按难度和用户分组

SELECT up.device_id,qd.difficult_level,ROUND(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END) / COUNT(qpd.question_id), 4) AS user_difficulty_rate
FROM ...
GROUP BY up.device_id, qd.difficult_level;

7.3 复杂条件筛选

WHERE up.university IN ('浙江大学', '复旦大学')AND qd.difficult_level IN ('hard', 'medium')AND qpd.date >= '2021-08-01';

八、总结与技术要点

8.1 核心技术点回顾

  1. 多表关联策略:通过内连接整合三张表的数据
  2. 分组聚合技巧
    • 使用SUM(CASE ...)统计条件计数
    • 使用COUNT统计总数
    • 使用ROUND控制结果精度
  3. 排序与过滤:合理使用WHEREGROUP BYORDER BY
  4. 索引优化:为连接字段和过滤条件创建复合索引

8.2 技术决策树

开始
│
├── 是否需要多表关联?
│   │
│   └── 是 → 选择合适的连接类型(INNER/LEFT)
│       │
│       ├── 仅保留匹配记录 → INNER JOIN
│       │
│       └── 保留主表所有记录 → LEFT JOIN
│
├── 是否需要分组统计?
│   │
│   └── 是 → 确定分组字段和聚合函数
│       │
│       ├── 统计总数 → COUNT
│       │
│       ├── 统计条件数 → SUM(CASE ...)
│       │
│       └── 计算比例 → SUM(...)/COUNT(...)
│
├── 是否存在性能问题?
│   │
│   └── 是 → 为JOIN字段和WHERE条件创建复合索引
│
└── 结束

通过深入理解多表关联和分组聚合的原理,结合合理的索引优化,你可以高效处理各种复杂的统计分析需求,避免常见的SQL性能陷阱,提升数据处理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/84086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS Code启动Git导致大量磁盘读写 - 解决方案

问题 通过VS Code打开项目后,若项目使用了Git,且文件数目较多,则VS Code会自动在后台调用Git检查项目修改,会造成大量磁盘读写,严重影响电脑性能。 解决方案 在VS Code设置中关闭Git功能,在终端中使用Gi…

Vue3 与 Vue2 区别

一、Vue3 与 Vue2 区别 对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上 “on”,功能上是类似的。不过有一点需要注意,组合式API的Vue3 中使用生命周期钩子时需要先引入,而 Vue2 在选项API中可以直接…

网络安全之身份验证绕过漏洞

漏洞简介 CrushFTP 是一款由 CrushFTP LLC 开发的强大文件传输服务器软件,支持FTP、SFTP、HTTP、WebDAV等多种协议,为企业和个人用户提供安全文件传输服务。近期,一个被编号为CVE-2025-2825的严重安全漏洞被发现,该漏洞影响版本1…

Word2Vec模型学习和Word2Vec提取相似文本体验

文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者,体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型,体验其使用。 Word2Vec模型 …

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…

MCP(一)——QuickStart

目录 1. MCP简介2. MCP的优势3. MCP核心4. QuickStart For Server Developers(仅具参考)4.1 MCP核心概念4.2 构建MCP服务器的代码4.2.1 设置MCP服务器实例4.2.2 辅助函数4.2.3 实现工具执行4.2.4 在Cherry-Studio中添加MCP服务器4.2.5 演示4.2.5.1 测试工具get_alerts4.2.5.2 测…

Nginx网站功能

一.基于授权的访问控制 1.基于授权的访问控制简介 Nginx与Apahce 一样&#xff0c;可以实现基于用户授权的访问控制&#xff0c;当客户端想要访问相应网站或者目录时&#xff0c;要求用户输入用户名和密码才能正常访问&#xff0c;配置步骤与Apache基本一致。 2.基于授权的访…

海外盲盒系统开发:重构全球消费体验的科技引擎

当盲盒文化席卷全球&#xff0c;海外盲盒系统开发已成为重构消费体验的核心赛道。数据显示&#xff0c;2025年全球盲盒市场规模突破120亿&#xff0c;东南亚市场年增长率达4540。我们开发的海外盲盒系统&#xff0c;以技术创新为驱动&#xff0c;打造覆盖全链路的全球化解决方案…

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…

C 语言学习笔记(指针1)

内容提要 函数 变量的作用域变量的生命周期 指针 预备知识变量指针与指针变量 函数 变量的作用域 引入问题 我们在函数设计的过程中&#xff0c;经常要考虑对于参数的设计&#xff0c;换句话说&#xff0c;我们需要考虑函数需要几个参数&#xff0c;需要什么类型的参数&a…

【Linux】第二十二章 访问网络附加内存

1. NFS的主要功能是什么&#xff1f; NFS是由Linux、UNIX及类似操作系统使用的互联网标准协议&#xff0c;主要功能就是提供网络文件共享&#xff0c;允许不同的计算机系统之间通过网络共享文件&#xff0c;它使得网络上的计算机能够像访问本地文件系统一样访问远程计算机上的…

大模型时代,Python 近红外光谱与 Transformer 模型:学习的必要性探究

在当下大语言模型盛行的时代&#xff0c;各类新技术如潮水般不断涌现&#xff0c;让人应接不暇。身处这样的浪潮之中&#xff0c;不少人心中都会泛起疑问&#xff1a;Python 近红外光谱和 Transformer 模型还有学习的必要性吗&#xff1f;今天&#xff0c;就让我们深入探讨一番…

强化学习鱼书(7)——神经网络和Q学习

代码地址 书内附代码地址 https://github.com/oreilly-japan/deep-learning-from-scratch-4 环境搭建 0.建立虚拟环境 conda create -n env_test python3.10 conda activate env_test1.安装cuda 50系的显卡只支持torch的nightlycuda12.8版本&#xff0c;别的版本会显示no k…

数据建模与分析:从回归预测到特征聚类的全面探索(PyTorch)

文章目录 简介&#xff1a;数据建模简介回归分析回归分析简介回归分析建模判定系数估计标准差住房价格回归预测 聚类聚类简介聚类分析建模植物花卉特征聚类 主成分分析&#xff08;PCA&#xff09;主成分分析简介成分分析建模地区竞争力指标降维 简介&#xff1a; 在现代数据科…

uv 包管理工具使用教程

一、简介 uv 是一个基于 Rust 实现的超快 Python 包管理工具&#xff0c;旨在加速 Python 开发流程。它是 pip、pip-tools、virtualenv 和 venv 的现代替代品&#xff0c;支持更快的包解析、安装和虚拟环境创建。 主要特性包括&#xff1a; 极快的依赖解析与安装 自动创建和…

5分钟应急响应+99%达标率:AI智能监控重塑商业清洁新标准

一、方案整体架构 面对商业综合体日均10万客流量带来的管理挑战&#xff0c;传统保洁模式在人员监管、质量评估和应急响应方面存在显著瓶颈。本系统以全场景AI监控为核心&#xff0c;构建三级智能化管理体系&#xff1a; 1. 前端感知层&#xff1a;部署800万像素广角摄像…

裸金属服务器:解锁极致性能,拒绝虚拟化开销!

什么是裸金属服务器&#xff1f; 裸金属服务器&#xff08;Bare Metal Server&#xff09;是一种介于物理服务器和云服务器之间的新型计算服务形态。它既具备传统物理服务器的性能优势&#xff0c;又拥有云服务器的灵活性和便捷管理特性。与虚拟化云服务器不同&#xff0c;裸金…

[论文精读]Ward: Provable RAG Dataset Inference via LLM Watermarks

Ward: Provable RAG Dataset Inference via LLM Watermarks [2410.03537] Ward: Provable RAG Dataset Inference via LLM Watermarks ICLR 2025 Rebuttal&#xff1a;Ward: 可证明的 RAG 数据集推理通过 LLM 水印 | OpenReview --- Ward: Provable RAG Dataset Inference v…

【ffmpeg】ffprobe基本用法

ffprobe 是 FFmpeg 工具集中的一个强大命令行工具&#xff0c;主要用于分析多媒体文件&#xff08;如视频、音频等&#xff09;的格式和内容信息。它可以提取文件的元数据、编解码器信息、流详情、帧信息等&#xff0c;而无需对文件进行转码或修改。 基本用法 ffprobe [选项] …

有哪些GIF图片转换的开源工具

以下是关于GIF图片转换的开源工具的详细总结,涵盖功能特点、适用场景及用户评价: 1. FFmpeg 功能特点: 作为开源命令行工具,FFmpeg支持视频转GIF、调整帧率、分辨率、截取片段等操作,可通过脚本批量处理。适用场景: 适合开发者或技术用户进行高效批处理,常用于服务器端自…