C#高级:数据库中使用SQL作分组处理3(ROW_NUMBER() 关键字)

news/2024/9/23 4:19:45/

一、分组后找出指定序号的数据

【需求】查出每个班级第三个注册入学的学生信息
【表和字段】Student: ID Class Name  Registrationtime

【实现SQL】

sql">WITH RankedStudents AS (SELECT ID,Class,Name,Registrationtime,ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Registrationtime) AS RowNum  --根据班级分组,注册时间排序赋序号FROM Student  
)
SELECT ID, Class, Name, Registrationtime
FROM RankedStudents
WHERE RowNum = 3;

【讲解】

ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Registrationtime) AS RowNum

      这是窗口函数 ROW_NUMBER() 的应用。它根据 Class 分区,并按 Registrationtime 升序排列,为每个分区中的行分配一个序号 RowNum,表示在每个班级内按注册时间排序的顺序。以便后面我们选出序号=3的学生。

二、分组后找出指定条件指定序号的数据

【需求】查出每个班级第三个注册入学的男学生信息,如果没有那么多男学生,则取第三个注册入学的学生(无论性别)的信息
【表和字段】Student: ID Class Name  Sex  Registrationtime

【实现SQL】

sql">WITH RankedStudents AS (SELECT ID,Class,Name,Sex,Registrationtime,ROW_NUMBER() OVER(PARTITION BY Class, Sex ORDER BY Registrationtime) AS RowNum,COUNT(CASE WHEN Sex = '男' THEN 1 END) OVER(PARTITION BY Class) AS MaleCount  --按班级分组,COUNT出每个班男学生人数FROM Student
),
ThirdMaleOrThirdStudent AS (SELECT ID,Class,Name,Sex,Registrationtime,RowNum,MaleCount,CASE WHEN MaleCount >= 3 AND Sex = '男' AND RowNum = 3 THEN 1    --男学生多且序号为3则赋Selected序号为1WHEN MaleCount < 3 AND RowNum = 3 THEN 1  --男学生少且存在第三个学生则赋Selected序号为1ELSE 0END AS SelectedFROM RankedStudents
)
SELECT ID, Class, Name, Sex, Registrationtime
FROM ThirdMaleOrThirdStudent
WHERE Selected = 1;--选出Selected序号为1的信息

【讲解】

COUNT(CASE WHEN Sex = '男' THEN 1 END) OVER(PARTITION BY Class) AS MaleCount 
    这是根据 Class 列进行分区计数,计算每个班级中男生的数量,并将结果命名为 MaleCount

另外:

1.第一个临时表 RankedStudents作用是为每个班每个学生分配一个排名,并计算每个班级中男生的总数。
2.第二个临时表 ThirdMaleOrThirdStudent作用是根据特定条件标记第三个男生或第三个学生。
3.最后一个部分是主查询,它从 ThirdMaleOrThirdStudent 中选择符合条件 Selected = 1 的学生信息。
4.CASE WHEN的作用:相当于程序中的IF-ELSE


http://www.ppmy.cn/news/1501873.html

相关文章

python机器学习12--Regression回归分析

1.数据准备 第一步&#xff1a;数据内容一定要有以下两种值域的因果数据。 特征&#xff08;Feature&#xff09;&#xff1a;因&#xff0c;在统计学称为自变量&#xff08;Independent Variable&#xff09;。 标签答案&#xff08;Label&#xff09;&#xff1a;果&a…

04-用户画像+sqoop使用

优点 sqoop的作用是实现数据的导入和导出&#xff0c;主要是对数据库和数据仓库之间的操作 只要是支持jdbc连接的数据库都可以使用sqoop操作 添加Sqoop到环境变量中 export SQOOP_HOME/export/server/sqoop export PATH$PATH:$SQOOP_HOME/bin:$SQOOP_HOME/sbinsource /etc/…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境&#xff08;py3.7&#xff09; 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

vue3在元素上绑定自定义事件弹出虚拟键盘

最近开发中遇到一个需求: 焊接机器人的屏幕上集成web前端网页, 但是没有接入键盘。这就需要web端开发一个虚拟键盘,在网上找个很多虚拟键盘没有特别适合,索性自己写个简单的 图片: 代码: (代码可能比较垃圾冗余,也没时间优化,凑合看吧) 第一步:创建键盘组件 为了方便使用…

力扣高频SQL 50题(基础版)第八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题1581. 进店却未进行过交易的顾客题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a;总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题 1581. 进店…

IOS-05 Swift循环控制语句

在 Swift 编程语言中&#xff0c;控制语句用于决定程序的执行流程&#xff0c;使我们能够根据不同的条件和情况来控制代码的执行顺序。下面我们将详细介绍几种常见的控制语句 一、for 循环 let names ["zhangsan","lisi"] for name in names{print(name…

cpp学习记录03

结构体 定义&#xff1a;用户自定义符合数据类型&#xff0c;可以包含不同类型的不同成员。 //声明结构体 struct 结构体类型&#xff08;自己起名&#xff09; {成员1类型 成员1名称&#xff1b;。。。成员N类型 成员N名称&#xff1b;} 基本用法&#xff08;类似class&…

应用层_计算机网络

文章目录 应用层HTTP用户与服务器的交互&#xff1a;cookieCookie、Cache、SessionWeb缓存HTTP/2 SMTPDNS&#xff1a;因特网的目录服务P2P文件分发BitTorrentCDN内容分发网 应用层 应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。应用层协议定义了以下内…