SQL分组后取topN

这篇具有很好参考价值的文章主要介绍了SQL分组后取topN。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

准备数据

create table SC(
SId varchar(10) comment "学生ID",
CId varchar(10) comment "课程ID",
score decimal(18,1) comment "课程成绩");

insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

1、TOP 1

求每门课程中成绩最好的人

使用窗口函数:

SELECT SId ,CId,score from (
SELECT SId,CId,score,dense_rank() over (partition by CId ORDER BY score desc) as ranking from sc ) new 
where ranking=1

利用表链接

SELECT a.*,b.max_score from sc a 
INNER JOIN (
SELECT CId,max(score) max_score
from sc
GROUP BY CId ) b 
on a.CId= b.CId and a.score= b.max_score;

使用子查询

SELECT * from sc a 
where score = (SELECT max(score) from sc  where a.CId=CId )

2、TOP N

求每门课程成绩前两人

使用窗口函数:

SELECT SId,CId,score from (
SELECT SId,CId,score,rank() over (PARTITION by CId ORDER BY score DESC) as ranking
from sc ) b
where ranking<=2;

使用自身左链接

SELECT SId,CId,score from (
SELECT a.* 
from sc a left  JOIN sc b 
on a.CId= b.CId and a.score <b.score  ORDER BY a.score DESC) new
GROUP BY SId,CId,score
HAVING count(CId)<2
ORDER BY CId;

结果:

SQL分组后取topN,sql,数据库

3、三种排名的方式

#这是代码
SELECT SId,CId,score,
row_number() over (partition by CId ORDER BY score desc) as row_number2,
rank() over (partition by CId ORDER BY score desc) as rank2,
dense_rank() over (partition by CId ORDER BY score desc) as dense_rank2
from sc
where CId = "01";

这是对CID分组,按分数排名的表

SQL分组后取topN,sql,数据库

上图中3中不同的排名方式,对应sql窗口函数的三种

row_number : 就是按1-2-3顺序排

rank:就是按 1-1-3 排列--这就是 美国式排名

dense_rank:就是按 1-1-2-2-3排列--这就是中国式排名

请牢记这三种排名哦!!!

应用:

需求:求每个班级每科成绩的第一名的学生文章来源地址https://www.toymoban.com/news/detail-687048.html

select name,subject,score,class
from (select name,subject,score,class,rank()
over (partition by class,subject order by score desc) as rank from score) score_tmp
where rank = 1;

到了这里,关于SQL分组后取topN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sql数据库怎么备份,sql 实时备份

    在当今互联网时代,数据已经成为企业的核心资产。然而,数据的安全性和完整性面临硬件问题、软件故障、人工操作错误等各种威胁。为了保证数据的安全,实时备份已经成为公司必须采取的重要措施之一。下面我们就重点介绍SQL实时备份的重要实施方法。 SQL实时备份的必

    2024年02月10日
    浏览(48)
  • SQL Server数据库——创建数据库

    目录 一、界面方式创建数据库 1.1创建数据库xscj,数据文件和日志文件的属性按默认值设置  1.2在xscj数据库中增加文件xcsj1,其属性均取系统默认值  1.3在数据库xscj中增加一个名为myGroup的文件组。 1.4数据库的重命名  1.5数据库的删除  二、命令方式创建数据库 以创建学生管

    2024年02月01日
    浏览(52)
  • sql 创建sql server数据库文件组

    可以在建立数据库时候创建 如: CREATE DATABASE MyDB ON PRIMARY                           --主文件组和主要数据文件   ( NAME=\\\'MyDB_Primary\\\',    FILENAME= \\\'c:MyDB_Prm.mdf\\\'), FILEGROUP MyDB_FG1                   --用户定义文件组1   ( NAME = \\\'MyDB_FG1_Dat1\\\',    FILENAME = \\\'c:MyDB_FG1_1.ndf\\\'),  --次要数

    2024年02月08日
    浏览(44)
  • SQL数据库案例1——创建商店数据库

    创建商店数据库Commodities_Management 创建商品表、供应商表、进货表、销售表 各表分别输入数据 库名:Commodities_Management 字符集:utf16 表一:商品表 字段名 类型 长度 约束 商品编号 varchar 10 外键(参照进货表) 商品名 varchar 30 — 规格 varchar 20 — 供应商编号 varchar 10 非空 表二:

    2024年02月12日
    浏览(34)
  • 数据库复试—关系数据库标准语言SQL

    SQL:结构化查询语言 以教材中的学生-课程数据库为例进行SQL基础语法的复习 数据库实验环境选择SQLServer 11 学生表Student( Sno ,Sname,Ssex,Sage,Sdept) 课程表Course( Cno ,Cname,Cpno,Ccredit) 学生选课表SC( Sno,Cno ,Grade) 数据建立 学生表数据 学号Sno 姓名 Sname 性别 Ssex 年龄 Sage 所在系 Sdept

    2024年01月24日
    浏览(45)
  • SQL 数据库语句- 创建和管理数据库

    SQL CREATE DATABASE 语句用于创建一个新的 SQL 数据库。 以下 SQL 语句创建了一个名为 \\\"testDB\\\" 的数据库: 通过这个简单的语句,你可以成功地创建一个名为 \\\"testDB\\\" 的数据库。记得在实际应用中,你可能需要添加其他选项,比如指定字符集、校对规则等,以满足具体需求。 SQL DRO

    2024年02月05日
    浏览(66)
  • 【Sql】Sql Server 2008 数据库附加,错误:9004

    【问题描述】 数据库文件存在异常状况,有可能是因为硬盘有坏区引起的。 附加数据库的时候,提示错误9004。 【解决方法】 假设数据库名称为:UFDATA_001_2023 请按顺序执行以下步骤: 1、将数据库的文件名:UFDATA_001_2023复制到别的位置留作备用; 2、新建数据库:UFDATA_001_

    2024年02月15日
    浏览(34)
  • SQL 数据库复制

    当需要将一台机器(源机器)上的一个数据库完全复制到另一台机器(目标机器)上时, 可以选择先在源机器上备份该数据库,然后在目标机器上还原该备份的方法。 在项目搬移到另一个服务器上的时候,可以使用这种方法。我之前搬了个50多G的数据,我就先生成备份,然

    2024年02月03日
    浏览(38)
  • SQL 数据库

    【1】 MySQL安装配置教程(超级详细、保姆级) 【2】 MySQL+Navicat安装配置教程(超级详细、保姆级) 【戴师兄】SQL入门免费教程 刷题链接:https://share.mubu.com/doc/4BHMMbbvIMb 学习笔记:https://share.mubu.com/doc/uf3vg8s5ar 【1】 零基础入门SQL - 知乎 学习笔记: https://mubu.com/doc/6M8yHBsz9lY

    2024年02月11日
    浏览(29)
  • 数据库基础——数据库、数据表和SQL语句

    数据库是用来存储、管理数据的仓库 数据表是数据的存储结构 Structured Query Language,结构化查询语言,用来操作数据库 安装MySQL,自行百度 进入cmd使用命令 mysql -hAddress -uUser -p(Password) 登录数据库 -p后直接回车可进入密文登录 如果出现以下报错,则打开任务管理器-服务-开启

    2024年02月09日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包