描述

现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):

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

请计算2021年上半年各类试卷的做完次数相比2020年上半年同期的增长率(百分比格式,保留1位小数),以及做完次数排名变化,按增长率和21年排名降序输出。

由示例数据结果输出如下:

解释:2020年上半年有3个tag有作答完成的记录,分别是C++、SQL、PYTHON,它们被做完的次数分别是3、3、2,做完次数排名为1、1(并列)、3;

2021年上半年有2个tag有作答完成的记录,分别是算法、SQL,它们被做完的次数分别是3、2,做完次数排名为1、2;具体如下:

因此能输出同比结果的tag只有SQL,从2020到2021年,做完次数3=>2,减少33.3%(保留1位小数);排名1=>2,后退1名。

WITHt2 AS (SELECTexam_id,IF(start_year = '2020', exam_cnt, NULL) exam_cnt_20, -- 2020年的完成次数LEAD(exam_cnt, 1) OVER (PARTITION BYexam_idORDER BYstart_year) exam_cnt_21, -- 2021年的完成次数IF(start_year = '2020', rk, NULL) exam_cnt_rank_20, -- 2020年的排名LEAD(rk, 1) OVER (PARTITION BYexam_idORDER BYstart_year) exam_cnt_rank_21 -- 2021年的排名FROM(SELECTexam_id,YEAR(submit_time) start_year,COUNT(score) exam_cnt,RANK() OVER (PARTITION BYYEAR(submit_time)ORDER BYCOUNT(score) DESC) rk/*分别对2021和2020的做完情况进行排名*/FROMexam_recordWHEREMONTH(submit_time) BETWEEN 1 AND 6 -- 选取上半年数据AND submit_time BETWEEN '2020-01-00 00:00:00' AND '2022-01-01 00:00:00' -- 选取2020和2021年的数据GROUP BYYEAR(submit_time),exam_id/*对年份和类别进行聚类*/) t1)
SELECTa.tag,exam_cnt_20,exam_cnt_21,CONCAT(ROUND((exam_cnt_21 - exam_cnt_20) * 100 / exam_cnt_20,1),'%') AS growth_rate,exam_cnt_rank_20,exam_cnt_rank_21,CAST(exam_cnt_rank_21 AS SIGNED) - CAST(exam_cnt_rank_20 AS SIGNED) AS rank_delta -- 需要转换格式,否则会报错
FROMt2LEFT JOIN examination_info AS a ON a.exam_id = t2.exam_id
WHEREexam_cnt_21 IS NOT NULL
ORDER BYgrowth_rate DESC,exam_cnt_rank_21 DESC;

🔍 代码逐层解析

🧱 1. 内层查询 t1 —— 按年份+试卷分组并排名

SELECTexam_id,YEAR(submit_time) AS start_year,COUNT(score) AS exam_cnt,RANK() OVER (PARTITION BY YEAR(submit_time)ORDER BY COUNT(score) DESC) AS rk
FROM exam_record
WHEREMONTH(submit_time) BETWEEN 1 AND 6AND submit_time >= '2020-01-01' AND submit_time < '2022-01-01'
GROUP BY YEAR(submit_time), exam_id
✅ 做了什么?
  • 筛选 2020 和 2021 年上半年 的数据
  • 按 年份 + 试卷 ID 分组
  • 统计每类试卷每年的完成次数COUNT(score)
  • 使用 RANK() 计算每年内的完成次数排名(降序)
⚠️ 注意:
  • BETWEEN 1 AND 6:精确筛选上半年
  • submit_time < '2022-01-01':避免包含 2022 年数据
  • RANK() 处理并列情况(如 3,3 → 排名 1,1,下一名为 3)

🧱 2. 中层查询 t2 —— 使用 LEAD() 对齐两年数据

SELECTexam_id,IF(start_year = '2020', exam_cnt, NULL) AS exam_cnt_20,LEAD(exam_cnt, 1) OVER (PARTITION BY exam_id ORDER BY start_year) AS exam_cnt_21,IF(start_year = '2020', rk, NULL) AS exam_cnt_rank_20,LEAD(rk, 1) OVER (PARTITION BY exam_id ORDER BY start_year) AS exam_cnt_rank_21
FROM t1
✅ 核心技巧:LEAD() 窗口函数
函数作用
LEAD(col, 1)获取当前行之后第 1 行的值
PARTITION BY exam_id按试卷分组,确保只在同 exam_id 内查找
ORDER BY start_year按年份升序排列(2020 → 2021)
💡 举个例子:

原始 t1 数据:

exam_idstart_yearexam_cntrk
900120201002
900120211501

经过 LEAD() 后:

exam_idexam_cnt_20exam_cnt_21rk_20rk_21
900110015021

✅ 实现了“将两年数据对齐到同一行”

📌 IF(start_year = '2020', ..., NULL) 的作用:
  • 将 2020 年的数据保留在 exam_cnt_20 字段
  • 2021 年该字段为 NULL
  • 配合 LEAD(),确保 exam_cnt_21 是下一年的值

🧱 3. 主查询 —— 计算增长率与排名变化

SELECTa.tag,exam_cnt_20,exam_cnt_21,CONCAT(ROUND((exam_cnt_21 - exam_cnt_20) * 100.0 / exam_cnt_20, 1), '%') AS growth_rate,exam_cnt_rank_20,exam_cnt_rank_21,CAST(exam_cnt_rank_21 AS SIGNED) - CAST(exam_cnt_rank_20 AS SIGNED) AS rank_delta
FROM t2
LEFT JOIN examination_info AS a ON a.exam_id = t2.exam_id
WHERE exam_cnt_21 IS NOT NULL
ORDER BY growth_rate DESC, exam_cnt_rank_21 DESC;
✅ 关键计算:
指标公式说明
增长率(2021 - 2020) / 2020 * 100%* 100.0 保证浮点运算
格式化输出CONCAT(..., '%')添加百分号
排名变化rank_21 - rank_20正数表示排名下降,负数表示上升
类型转换CAST(... AS SIGNED)避免字符串减法报错
✅ 过滤与排序:
  • WHERE exam_cnt_21 IS NOT NULL:确保该试卷在 2020 和 2021 都存在
  • ORDER BY growth_rate DESC:增长率从高到低
  • exam_cnt_rank_21 DESC:2021 年排名靠后的优先(同增长率时)

📝 核心知识点总结

技术点说明应用场景
LEAD()/LAG()获取下一行/上一行的值同比、环比分析
RANK()处理并列排名排行榜、绩效排名
PARTITION BY窗口函数分组分组内排序、对比
CONCAT + ROUND格式化数值输出百分比、金额显示
CAST(... AS SIGNED)类型转换字符串转整数计算
WITH ... AS ()CTE 公共表表达式分步处理复杂逻辑

✅ 最佳实践建议

  1. 时间范围写法

    • ❌ BETWEEN '2020-01-00'(非法日期)
    • ✅ submit_time >= '2020-01-01' AND submit_time < '2022-01-01'
  2. 增长率计算注意除零

    • 可加 WHERE exam_cnt_20 > 0
  3. 排名函数选择

    • RANK():允许并列,下一名跳过(1,1,3)
    • DENSE_RANK():允许并列,下一名不跳过(1,1,2)
    • ROW_NUMBER():强制唯一,无并列
  4. LEAD() 的适用场景

    • 跨行对比(如:今年 vs 去年)
    • 避免自连接,提升性能

🎯 一句话总结

“用 LEAD() 实现跨年数据对齐,RANK() 计算年度排名,CONCAT+ROUND 格式化增长率,完成试卷类别的同比分析”

这套模式适用于:

  • 年度/季度/月度对比分析
  • 排名变化监控
  • 增长率计算与展示

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

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

相关文章

网络编程中的TCP——TCP的连接的建立、关闭、状态转移

网络编程中的TCP——TCP的连接的建立、关闭、状态转移 TCP连接的建立和关闭wireshark捕获数据&#xff1a;TCP三次握手四次挥手的时序图&#xff1a;三次握手&#xff1a; 报文段1包含SYN标志&#xff0c;这是一个同步报文段&#xff0c;表示发起连接请求&#xff0c;包含自己起…

SQL 语句拼接在 C 语言中的实现与安全性分析

代码解析 // 构建SQL插入语句 char *sql_insert (char *)malloc(sizeof(char) * 200); // 分配200字节内存 strcpy(sql_insert, "INSERT INTO user(username, passwd) VALUES("); // 复制基础SQL语句 strcat(sql_insert, ""); // 添加单引号 strcat(sq…

`lock()` 和 `unlock()` 线程同步函数

1) 函数的概念与用途 lock() 和 unlock() 不是特定的标准库函数&#xff0c;而是线程同步原语的一般概念&#xff0c;用于在多线程环境中保护共享资源。在不同的编程环境和库中&#xff0c;这些函数有不同的具体实现&#xff08;如 POSIX 线程的 pthread_mutex_lock() 或 C 的 …

升级openssh后ORACLE RAC EM 安装失败处理

升级过程中由于SCP传输时目标目录/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans 不存在导致的OC4J配置失败&#xff1a;WARNING: /usr/bin/scp: dest open "/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans": No such file or directory/usr/bin/scp…

ADB 调试工具的学习[特殊字符]

一、ADB 的工作原理 1.1 ADB 概念 ADB (Android Debug Bridge)&#xff1a;Android 调试桥&#xff0c;是开发/测试 Android 应用必备的调试工具。作用&#xff1a;通过 电脑终端命令 操作 安卓手机/模拟器。 1.2 ADB 构成与原理 ADB 由三部分组成&#xff1a; Client 端&#…

用一根“数据中枢神经”串起业务从事件流到 Apache Kafka

1. 为什么是“事件流”&#xff1f; 在一个软件定义、自动化、永远在线的世界里&#xff0c;系统之间最需要的是&#xff1a;把发生了什么这件事&#xff0c;第一时间、按正确顺序、可靠地传到该知道的人/系统那里。 事件流就像企业的中枢神经&#xff1a;它把数据库更新、设备…

【RAGFlow代码详解-4】数据存储层

数据库基础设施 RAGFlow 使用关系数据库&#xff08;MySQL 或 PostgreSQL&#xff09;作为主要元数据存储&#xff0c;通过具有连接池和重试机制的 Peewee ORM 进行管理。 连接管理 数据库连接通过 service_conf.yaml 和环境变量进行配置。该系统支持具有可配置连接池的 MySQL …

ES_映射

一、 映射&#xff08;Mapping&#xff09;是什么&#xff1f; 简单来说&#xff0c;映射就像是关系型数据库中的表结构定义&#xff08;Schema&#xff09;。它定义了索引&#xff08;Index&#xff09;中的文档&#xff08;Document&#xff09;可以包含哪些字段&#xff08;…

【Linux | 网络】多路转接IO之poll

一、poll函数二、poll的优缺点三、实现poll服务器&#xff08;只关心读事件&#xff09;3.1 Log.hpp&#xff08;日志&#xff09;3.2 Lockguard.hpp&#xff08;自动管理锁&#xff09;3.3 Socket.hpp&#xff08;封装套接字&#xff09;3.4 PollServer.hpp&#xff08;服务端…

一站式资源共享平台模板,助力快速搭建专属资源站源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 这个资源分享网站模板是一个功能完整、设计现代的单页网站&#xff0c;非常适合快速搭建资源分享平台。以下是关于这个模板的详细介绍&#xff0c;帮助你更好地理解并发布到自己的网站&a…

ngnix的部分配置

1. 禁止特定IP地址访问你可以通过在Nginx配置文件中添加deny指令来阻止特定IP地址或IP地址段的访问。server {listen 80;server_name example.com;location / {deny 192.168.1.0/24;allow all;} }2. 允许特定IP地址访问如果你想允许只有特定IP地址或IP地址段的访问&#xff0c;…

Qwt7.0-打造更美观高效的Qt开源绘图控件库

概述 Qt 生态里能画图的库不多&#xff0c;主流的为QCustomPlot、Qwt、Qt Charts和KDChart&#xff0c;Qt6.8之后把原来的 Qt Charts&#xff08;2D&#xff09; 与 Qt DataVisualization&#xff08;3D&#xff09; 合并为统一的Qt Graphs模块&#xff08;注意不是Qt Graphic…

NFC线圈设计计算

对工作于13.56MHz的电感耦合的NFC系统,针对小距离的传统天线通常是环形或者矩形的扁平线圈。 圆形扁平线圈计算评估 对于二阶估计,我们可以由匝数决定的电感等式为 考虑到线圈的物理参数,设置平均直径:D_averD0-N(gw) 线圈周长: &#xff1b;d2*(w t)/π 初始设置中的这种电感…

mac设置鼠标滚轮方向

mac中滚轮的滑动方向和windows是相反的&#xff0c;如果需要设置和windows相同&#xff0c;设置如下&#xff1a;将自然滚动关闭即可。

QSpinBox的用法及其使用QSS对其美化

摘要 在现代应用程序开发中&#xff0c;提供一个直观且用户友好的界面至关重要。Qt框架提供了丰富的控件和工具&#xff0c;帮助开发者实现这一目标。本文将详细介绍如何使用Qt的QSpinBox控件让用户输入数值&#xff0c;并通过Qt Style Sheets (QSS) 美化界面&#xff0c;提升…

18 继续学习

要设计出一个好的系统&#xff0c;需要多年的知识积累。有一个捷径是研究真实世界的系统架构。本文将介绍一些有帮助的阅读材料。 务必留意那些真实系统之间共通的原理和相同的底层技术。研究每个技术并了解它解决了什么问题&#xff0c; 这是一个巩固基础知识和完善设计过程的…

深度学习篇---混淆矩阵

要理解混淆矩阵&#xff08;Confusion Matrix&#xff09;&#xff0c;我们可以从它的名字入手&#xff1a;它本质是一张 “帮你理清模型预测结果到底‘混淆’在哪里” 的表格&#xff0c;核心作用是评估分类模型的表现 —— 比如判断一张图片是 “猫” 还是 “狗”、一封邮件是…

MySQL重大隐患!mysqlpump的--set-gtid-purged参数在5.7和8.0的雷区

MySQLPump是MySQL官方提供的一个用于备份和恢复MySQL数据库的工具。它于MySQL 5.7.8版本中首次引入&#xff0c;旨在提供一种快速、可靠且高效的备份和恢复解决方案。MySQL Pump首次支持了并行导出、压缩导出&#xff0c;可以利用多核CPU来提高备份能力&#xff0c;在效率上要比…

低质量视频变高清AI:告别模糊,重现清晰画质

在数字时代&#xff0c;视频内容的创作和消费日益普及&#xff0c;然而&#xff0c;许多早期拍摄或存储的视频&#xff0c;由于技术限制或压缩等原因&#xff0c;往往存在画质不佳的问题&#xff0c;如模糊、噪点多、分辨率低等。这不仅影响观看体验&#xff0c;也限制了这些珍…

Linux入门教程 第十二章 防火墙

文章目录前言一、 iptables 概述Netfilter二、iptables 的表、链结构2.1 ptables的四表五链结构介绍2.1.1 四表五链2.1.2 四表2.1.3 **五链**2.2 数据包过滤的匹配流程&#xff08;数据包到防火墙&#xff09;2.2.1 规则链之间的匹配顺序:主机型防火墙:2.2.2 规则链内的匹配顺序…