文档章节

sql中筛选第一条记录【分组排序】

o
 osc_zoa3moe9
发布于 2019/12/08 14:44
字数 598
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

####问题描述 我们现在有一张表titles,共有4个字段,分别是emp_no(员工编号),title(职位),from_date(起始时间),to_date(结束时间),记录的是员工在某个时间段内职位名称,因为会存在升职,转岗之类的,里面emp_no可能会对应多个职位,我们现在要取到所有员工最近的职位信息,包括离职员工。


本文介绍两种方法去实现结果: #####方法一 嵌套一个group by+max()子查询获取最近的职位信息。 ######思路

  1. 通过对emp_no分组取每个emp_no对应的最大的from_date;
SELECT
	emp_no,
	max( from_date ) AS max_date 
FROM
	titles 
GROUP BY
	emp_no

结果如下: image.png

  1. 通过查询出来的最大的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

结果如下: image.png


#####方法二 通过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~

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Laravel关联模型中过滤结果为空的结果集(has和with区别)

<p>首先看代码:</p> <p>数据结构是三张表用户优惠券表(usercoupons)、优惠券表(coupons),商家表(corps),组优惠券表(groupcoupons) (为了方便查看,后两项已去除)</p><p>这里我本意想用......

osc_rs0lpejm
2018/11/15
5
0
Oracle的ROWNUM如何标识记录

获取表里前5条记录,Oracle写法: SELECT *FROM your_tableWHERE column1>value1 AND rownum <= 5 Oracle使用关键字rownum来限制返回结果集的条数;在《SQL CookBook》一书里给出了rownum的工...

placeholder
2013/12/02
54
0
第七章 Django框架——ORM介绍之单表操作

第七章 Django框架——ORM介绍之单表操作 一、增加表记录 二、删除表记录 三、修改表记录 四、查询表记录 补充: Django终端打印原生sql方法 # 在settings中进行如下配置LOGGING = { } 在Pyt...

osc_f9olhm1n
2018/09/10
2
0
GROUP BY的用法_无需整理

在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。   这里...

辣条拌鱼翅
2015/01/01
18
0
VBA-数据库操作

基本概念 1 怎么样才能操作数据库? 使用ADO建立和数据库的连接,然后用ADO对象和sql语言对数据库进行操作。 2 SQL是什么? SQL(Structured Query Language)是一种查询语言,可以查询、更新数...

osc_12yjz2ym
2019/07/10
1
0

没有更多内容

加载失败,请刷新页面

加载更多

Mysql 通过binlog日志恢复数据

Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据...

osc_lduvstkg
54分钟前
24
0
前端js日期时间格式转换

前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示。 下面是分享一些不同格式的日期转换函数方法。 /** * 时间戳转时间 * @param...

osc_gccs85s0
55分钟前
9
0
微服务中如何设计一个权限授权服务

基于角色的访问控制 (RBAC)   是将系统访问限制为授权用户的一种方法,是围绕角色和特权定义的与策略无关的访问控制机制,RBAC的组件使执行用户分配变得很简单。   在组织内部,将为各种...

osc_ie20bwji
57分钟前
12
0
前端js日期时间格式转换

前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示。 下面是分享一些不同格式的日期转换函数方法。 /** * 时间戳转时间 * @param...

osc_sqfqhs81
59分钟前
38
0
(转)【D3D11游戏编程】学习笔记三:XNAMath之XMMATRIX

(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在熟悉了XMVECTOR的风格及规则之后,再来了XNA数学库中的矩阵就容易...

osc_yumj26qz
今天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部