SQL185 試卷完成數同比2020年的增長率及排名變化

描述

現有試卷信息表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 規則鏈內的匹配順序…