分组取前几位

分组取前几位是数据库查询的常见问题,例如取各班成绩的第一名。这个就需要用到ROW_NUMBER函数,这个函数Oracle,SQLServer,MySQL(需8.0以上版本)都是支持的,核心用法也一样:PARTITION BY分组 + ORDER BY排序 + 外层筛选使用rn筛选。

假设表student_score有如下字段

studentid 学生id

score 总分

student_info 学生表

studentid 学生id

classid 班级

studentname 学生姓名

查询语句如下:

select * from (

select a.*

ROW_NUMBER()

OVER (PARTITION BY a.classid ORDER BY a.score DESC) AS rn --核心点1

from (select studentid,studentname,classid,score from student_score left join student_info on student_score.studentid=student_info.studentid)a

)

where rn=1 --核心点2

低版本只能使用max函数了,要复杂的多。

相关推荐
troy1286 小时前
向量数据库选型指南:Milvus / Qdrant / Chroma / pgvector
数据库·milvus
彧azz6 小时前
Redis 全面指南:从核心概念到高可用架构实战
数据库·redis·架构
DBA小马哥7 小时前
MongoDB 数据同步怎么做?oplog、Change Streams、同步工具 4 种方案一次讲清(附踩坑清单)
数据库·mongodb
香菜TTT8 小时前
Redis的哨兵机制
java·数据库·redis
风哥2号9 小时前
数据库教程FGMT13‑Oracle性能优化之数据仓库与分区表
数据库·oracle·性能优化
玉宇夕落9 小时前
Docker + Milvus,数据库永久存放记忆,让对话历史永不丢失
数据库·docker·llm
Zenova EdgeOS10 小时前
工业网关数据持久化:从同步到 WAL 的工程实战
网络·数据库·oracle
企查查数据服务10 小时前
全军禁入下客商准入风控,关联图谱与穿透核查
大数据·开发语言·数据库·php
冰帆<10 小时前
DBViewer — 把数据库工作台,安装进浏览器
数据库·数据可视化·数据同步