sql中筛选第一条记录【分组排序】
问题描述
我们现在有一张表titles,共有4个字段,分别是emp_no(员工编号),title(职位),from_date(起始时间),to_date(结束时间),记录的是员工在某个时间段内职位名称,因为会存在升职,转岗之类的,里面emp_no可能会对应多个职位,我们现在要取到所有员工最近的职位信息,包括离职员工。
本文介绍两种方法去实现结果:
方法一
嵌套一个group by+max()子查询获取最近的职位信息。
思路
- 通过对emp_no分组取每个emp_no对应的最大的from_date;
SELECT
emp_no,
max( from_date ) AS max_date
FROM
titles
GROUP BY
emp_no
结果如下:

- 通过查询出来的最大的from_date取筛选最近的的一条职位信息。
SELECT
t.emp_no,
t.title
FROM
titles t
LEFT JOIN ( SELECT emp_no, max( from_date ) AS max_date FROM titles GROUP BY emp_no ) et
ON t.emp_no = et.emp_no AND t.from_date = et.max_date
结果如下:

方法二
通过rank over partition by函数实现,这个目前是Oracle独有的函数,如果你用的是mysql或者sql server就没办法使用了。
语法
功能:在原有表的基础上加上一个根据条件排序的伪列。
SELECT
*,
RANK() OVER (PARTITION BY emp_no ORDER BY from_date DESC) AS rank
FROM
titles
RANK() OVER (PARTITION BY emp_no ORDER BY from_date DESC) AS rank表示把表根据emp_no进行分区,然后在分区内根据from_date进行降序排列,排序结果生成一列命名为rank。
我们之前在问题里面提到了一个emp_no会对应多条职位信息,然后对于每个emp_no的记录进行一个降序排列,接下来我们只需要把上面的结果当成一个子查询然后筛选rank = 1 就好了。
完整代码如下
SELECT
*
FROM
( SELECT *, RANK ( ) OVER ( PARTITION BY emp_no ORDER BY from_date DESC ) AS rank FROM titles ) r
WHERE
r.rank = '1'
由于我笔记本只装了mysql的环境,所以就没法给各位展示效果了。
综上,如果各位目前使用的是Oracle,推荐各位使用方法二:
- 方法二容错率高,如果titles表里面有两条记录emp_no和from_date都是一样的,方法一就会报错了,单条子查询返回多行;
- 方法二还可以实现取第二条,第三条等等的记录,方法一只有一个最大或者最小可供选择。
peace~
sql中筛选第一条记录【分组排序】的更多相关文章
- 160804、oracle查询:取出每组中的第一条记录
oracle查询:取出每组中的第一条记录按type字段分组,code排序,取出每组中的第一条记录 方法一: select type,min(code) from group_info group by ...
- linq中分组查询而且获取每个分组中的第一条记录,数据用于分页绑定
LINQ分组取出第一条数据 Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: I ...
- Sqlserver 如何获取每组中的第一条记录
在日常生活方面,我们经常需要记录一些操作,类似于日志的操作,最后的记录才是有效数据,而且可能它们属于不同的方面.功能下面,从数据库的术语来说,就是查找出每组中的一条数据. 例子 我们要从上面获得的有效 ...
- 【ORACLE】SQL查询出每个组中的第一条记录
CREATE TABLE [TestTable] ( ) NOT NULL , ) NOT NULL , ) ))) GO ALTER TABLE [TestTable] ADD PRIMARY KE ...
- sql中插入多条记录-微软批处理
这是使用批处理的一个例子: System.IO.StreamWriter messagelog = null; string messageString = ""; SqlConn ...
- 160805、oracle查询:取出每组中的第一条记录
在Java 9发布之前,我们来分享一些Java 8开发技巧 [以下为译文] 在使用JAVA 8进行开发多年后,结合个人使用IntelliJ IDEA的心得,我总结了以下几个JAVA8技巧供大家参考. ...
- sql 选取分组中的第一条,显示聚合以外的列,having字句的使用
分组中的第一条:select * from(select row_number() over(partition by 列1,列2,... order by 列1,列2,...) as rownum ...
- sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...
- Oracle-left join两表关联只取B表匹配到的第一条记录【over partition by(分组后对组内数据排序)】
背景: A表.B表两表关联,关联出来的结果里B表有不止一条,需求是只要B表结果中的某一条(按某字段排序) 经过百度,发现 row_number() over(partition by a order ...
随机推荐
- iOS 报错信息: dyld: Library not loaded: @rpath/XCTest.framework/XCTest Referenced from
新建项目,引入framework,运行时出现警告:dyld: Library not loaded: @rpath/RLLibrary.framework/RLLibrary Referenced ...
- Django框架(十三)--Django分页组件
一.分页器 数据量大的话,可以分页获取,查看 例如:图书管理中,如果有成千上万本书,要是都在一个页面中渲染出来,会影响页面美观,所以就要用分页器分页渲染 二.分页器的使用 基本写法 基本写法: 后端: ...
- Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)
备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...
- Docker安装Redis4.0
docker pull redis:4.0 拉取Redis4.0镜像 docker images 查看本地的镜像 mkdir -p /root/redis4.0/data 在宿主机创建数据文件目录 w ...
- 201671010459 张旭辉 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课程学习内容 github仓库地址链接 [Git ...
- 使用log4Net输出调试信息
在上一篇搭建服务器端的项目基础上,使用log4Net进行调试信息输出 http://www.cnblogs.com/fzxiaoyi/p/8439769.html 1.先分析下Photo 自带的服务器 ...
- centos7删除Apache组件
非特殊需要不要删除centos7中Apache等组件!首先查看centos中Apache版本(前面我们说了centos7删除PHP,centos7删除MariaDB,可能很多朋友会有疑问为什么要把所有 ...
- 学习:API断点
API的介绍:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而 ...
- 修改MyEclipse/Eclipse左侧文字大小(MacOS/Windows)
一.Windows 首先找到 Eclipse/MyEclipse 的安装目录,然后找到如下目录: \plugins\org.eclipse.ui.themes_1.1.200.v20160815-05 ...
- spring学习3
spring整合JDBC spring提供了很多模板整合Dao技术 spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模板对象 ...