在一张表中,有同一个人的多条数据,但只查询出最接近日期的那一条数据,怎么查?

时间:2020-12-19 14:47:22
以下表为例

姓名       工作岗位          生效日期
-------------------------------------------
葛优       行政部人事助理     2003-09-01
.......
冯小刚     生产部副经理       2003-10-21
张艺谋     管理部品管         2003-10-25
.......
葛优       行政部人事经理     2004-01-01
冯小刚     生产部经理         2004-01-01
......
张艺谋     管理部副经理       2004-03-22
......


查询出来的内容就是:
姓名       工作岗位          生效日期
-------------------------------------------
冯小刚     生产部经理         2004-01-01
葛优       行政部人事经理     2004-01-01
张艺谋     管理部副经理       2004-03-22

请注意:因为这个表的输入顺序不一定是按日期前后输入的,因此不能判断同一个人的不同记录输入顺序,因此查询只能按“生效日期”来排列。谢谢!

12 个解决方案

#1


select a.*
from 表 a join(
select 姓名,生效日期=max(生效日期) from 表 group by 姓名
)b on a.姓名=b.姓名 and a.生效日期=b.生效日期

#2


不用这么麻烦吧!

#3


楼上,
请说说你的想法

学习

#4


参考:
name:姓名
num:日期

select name,num=(select top 1 num from emp a where name=b.name order by num desc)
from (select distinct name from emp)b

#5


学习更简单的方法,期待ing

#6


zjcxc(邹建)的代码有用。

但我也象 internetcsdn(公元1979年8月10日) 一样好奇,希望能解释一下。让我们学习学习。
internetcsdn(公元1979年8月10日)的代码我不能用啊。

#7


顶一下。

#8


楼主:
请问是我的代码有错?
还是效率不高?

#9


TO:internetcsdn(公元1979年8月10日) 
没有能正确执行出来。

#10


还可以这样写:(语句比较简洁)

select 姓名,max(工作岗位),max(生效日期) from 表 group by 姓名

#11


因为 查询结果 基于 “同一个人对应一个工作岗位” 的假定,这样只需要简单分组就能实现,因为同一组中不同的只是 生效日期

#12


TO: SoarInAir(亮子)
你的代码不能得到一个正确的结果。比如说:我的表中有这样同一个人的信息:

员工编号 员工姓名 工作岗位                         生效日期
-------------------------------------------------------------
B159 冯小钢 品质保证部检查组进货检查    2004年3月14日
B159 冯小钢 品质保证部检查组出荷检查工责    2004年4月29日

根据你的代码,会得出一个错误的结果:
B159 冯小钢 品质保证部检查组进货检查    2004年4月29日

事实上,这条查询记录是错误的。但根据zjcxc(邹建)的代码,就能得到正确的结果。我是根据这条记录来判断代码的正确与否的。

#1


select a.*
from 表 a join(
select 姓名,生效日期=max(生效日期) from 表 group by 姓名
)b on a.姓名=b.姓名 and a.生效日期=b.生效日期

#2


不用这么麻烦吧!

#3


楼上,
请说说你的想法

学习

#4


参考:
name:姓名
num:日期

select name,num=(select top 1 num from emp a where name=b.name order by num desc)
from (select distinct name from emp)b

#5


学习更简单的方法,期待ing

#6


zjcxc(邹建)的代码有用。

但我也象 internetcsdn(公元1979年8月10日) 一样好奇,希望能解释一下。让我们学习学习。
internetcsdn(公元1979年8月10日)的代码我不能用啊。

#7


顶一下。

#8


楼主:
请问是我的代码有错?
还是效率不高?

#9


TO:internetcsdn(公元1979年8月10日) 
没有能正确执行出来。

#10


还可以这样写:(语句比较简洁)

select 姓名,max(工作岗位),max(生效日期) from 表 group by 姓名

#11


因为 查询结果 基于 “同一个人对应一个工作岗位” 的假定,这样只需要简单分组就能实现,因为同一组中不同的只是 生效日期

#12


TO: SoarInAir(亮子)
你的代码不能得到一个正确的结果。比如说:我的表中有这样同一个人的信息:

员工编号 员工姓名 工作岗位                         生效日期
-------------------------------------------------------------
B159 冯小钢 品质保证部检查组进货检查    2004年3月14日
B159 冯小钢 品质保证部检查组出荷检查工责    2004年4月29日

根据你的代码,会得出一个错误的结果:
B159 冯小钢 品质保证部检查组进货检查    2004年4月29日

事实上,这条查询记录是错误的。但根据zjcxc(邹建)的代码,就能得到正确的结果。我是根据这条记录来判断代码的正确与否的。