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

SQL 189 统计有未完成状态的试卷的未完成数和未完成率

 题目描述

现有表 exam_record,记录用户作答试卷的信息:

字段名含义
uid用户 ID
exam_id试卷 ID
start_time开始作答时间
submit_time交卷时间(NULL 表示未完成)
score得分

 要求:

统计有未完成状态的试卷的:

  • incomplete_cnt:未完成数量(即 submit_time 为 NULL 的记录数)
  • incomplete_rate:未完成率(保留 3 位小数)

✅ 只输出未完成率 > 0 的试卷。


 解题思路

Step 1:理解“未完成”的定义

  • 一条记录只要 submit_time IS NULL,就表示未完成
  • 注意:start_time 通常非空(表示已开始作答),所以每条记录都算一次“作答尝试”。

Step 2:核心统计逻辑

  • 每个 exam_id 分组后:
    • 总作答次数 = COUNT(*)
    • 已完成次数 = COUNT(submit_time)(自动忽略 NULL)
    • 未完成次数 = COUNT(*) - COUNT(submit_time)
    • 未完成率 = (未完成次数) / (总次数)

Step 3:过滤条件

  • 外层使用 WHERE incomplete_rate > 0,只保留有未完成记录的试卷。

 正确代码

SELECTexam_id,incomplete_cnt,incomplete_rate
FROM(SELECTexam_id,COUNT(*) - COUNT(submit_time) AS incomplete_cnt,ROUND((COUNT(*) - COUNT(submit_time)) * 1.0 / COUNT(*), 3) AS incomplete_rateFROMexam_recordGROUP BYexam_id) AS exam_stats
WHEREincomplete_rate > 0;

 代码解析(逐行详解)

行号代码片段说明
1-3SELECT exam_id, incomplete_cnt, incomplete_rate选择最终输出字段
4FROM (...) AS exam_stats使用子查询封装聚合结果,提高可读性
6COUNT(*) - COUNT(submit_time)计算未完成数量:
• COUNT(*):总记录数
• COUNT(submit_time):非 NULL 的交卷数(即已完成)
7ROUND((...) * 1.0 / COUNT(*), 3)计算未完成率:
• * 1.0 强制转为浮点数,避免整数除法(如 1/3=0)
• ROUND(..., 3) 保留三位小数
8FROM exam_record数据源
9GROUP BY exam_id按试卷分组,进行聚合统计
12-14WHERE incomplete_rate > 0过滤掉“全部完成”的试卷(即未完成率为 0 的)

易错点与注意事项

问题说明如何避免
❌ WHERE 中使用聚合函数COUNT() 不能在 WHERE 中直接使用使用 HAVING 或子查询
❌ 整数除法导致结果为 0(3-2)/3 = 0(整数除法)加 * 1.0 或 CAST(... AS FLOAT)
❌ 错误使用 COUNT(start_time)本题中 start_time 总是非空,可用 COUNT(*) 更简洁统一使用 COUNT(*) 作为总次数
❌ 忘记 GROUP BY聚合查询必须分组记住:有聚合函数 + 非聚合字段 → 必须 GROUP BY
❌ 未过滤 incomplete_rate = 0题目要求“有未完成状态”外层加 WHERE incomplete_rate > 0

💡 关键知识点总结

知识点说明
COUNT(column)只统计 column IS NOT NULL 的行
COUNT(*)统计所有行,包括 NULL 值
聚合函数不能在 WHERE必须用 HAVING 或子查询
浮点除法陷阱整数除法会截断小数,需转浮点
ROUND(x, 3)保留 3 位小数
子查询封装先聚合,再过滤,结构更清晰

exam_id   incomplete_cnt   incomplete_rate
9001      1                0.333

复习口诀(助记)

“先分组,再聚合;
总数减完成,得未完数;
乘1.0防整除,ROUND保留三;
外层过滤零,子查结构佳。”


终于不是窗口函数了,有种解放了的感觉

http://www.dtcms.com/a/545040.html

相关文章:

  • 有哪些做微信小游戏的网站建设网站后期人员薪酬
  • 黑龙江交通基础设施建设网站怎么做推广网站
  • 企业微信AI SCRM推荐:从技术适配与场景功能实践进行评估
  • 从开源到落地:SimpleBGC 三轴稳像平台全栈技术解析(下)
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——Keepalived双机热备
  • 网站建设论坛做一个网站的流程
  • 金仓数据库平替MongoDB:银行存款系统国产化实践
  • 基于 Spring AI Alibaba 搭建 Text-To-SQL 智能系统(前置介绍)
  • 搞笑资讯网站源码数据库支持的网站怎么做
  • 友思特应用 | 基于高精度双目散斑 3D 相机的放射治疗视觉定位应用
  • MCU寄存器配置深度解析:从原理到实践
  • 论文学习_LLM4Decompile: Decompiling Binary Code with Large Language Models
  • 【日记】好耶!是新电脑!(3959 字)
  • Day73 嵌入式传感器技术全栈开发
  • 学历提升有几种方式长沙正规seo优化公司
  • 合肥网络公司 网站建设网站建设 预算
  • 23大数据 数据挖掘集合
  • Docker Compose曝路径遍历漏洞,可致任意覆写文件(CVE-2025-62725)
  • 网站可以分为哪些类型怎样优化自己的网站
  • Rust 模式匹配的穷尽性检查:从编译器证明到工程演进
  • C# Entity Framework Core 中的 Include 和 ThenInclude 详解
  • Linux如何远程控制Windows?rdesktop让跨系统操作像本地一样流畅
  • Spring Boot3零基础教程,JVM 编译原理,笔记87
  • Rust 变量声明与可变性:从设计哲学到工程实践
  • 深圳苍松大厦 网站建设对网站做综合搜索引擎优化分析
  • 数据结构 09 二叉树作业
  • 建网站需要买什么平台公司信用评级
  • 算法19.0
  • 【第五章:计算机视觉-项目实战之推荐/广告系统】3.精排算法-(3)精排模块多目标融合:从线性融合到Bayes方程融合原理
  • 【详细教程】对拍 0 基础学习小课堂 [内附例题演示]