如何写这样一条有挑战性的SQL?

risingsoft 2005-11-23 02:47:18
现有表:
员工考勤表(单位编号+员工编号+上班时间+...)

说明:无主键,此表在员工每日上班都会登记一次(纪录一条考勤纪录)

需求:
想按单位查该单位所有员工最后一次上班考勤时间清单,例如原始数据是:
单位编号 员工编号 上班时间
100001 100001 2005-01-01 08:17:15
100001 100002 2005-01-01 08:20:10
100001 100001 2005-01-02 08:10:24

要求的结果是:
单位编号 员工编号 上班时间
100001 100001 2005-01-02 08:10:24
100001 100002 2005-01-01 08:20:10

如您回复能满足要求,会全额给分
...全文
498 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
gicjoe 2006-06-29
  • 打赏
  • 举报
回复
select * from 员工考勤表 order by 上班时间 desc having 员工编号
digboy 2006-06-23
  • 打赏
  • 举报
回复
蓝天的写法有借鉴性,这个问题可以通过分析函数来解决,楼主去注意一下相关的文档吧:)
risingsoft 2006-06-16
  • 打赏
  • 举报
回复
只想告诉有些人,别把问题看得太简单。如果你的代码自己测试过,自己动手试验过并证明是正确的,你才有资格说OK。否则,你对问题的藐视就是对你自己的蔑视。

一句话:老邓说得好:实践是检验真理的唯一标准
risingsoft 2006-06-16
  • 打赏
  • 举报
回复
呵呵。很多个月过去了。。。
googe 2005-12-30
  • 打赏
  • 举报
回复
让大家看看我的写法,^_^

select * from
( select a.*, rownumber() over(partition by 员工编号 order by 上班时间 desc) as row_num
from 员工考勤表
) b
where row_num=1;

是不是没见过,^_^




邦腾科技 http://www.partner-soft.com
tangtangno1 2005-12-17
  • 打赏
  • 举报
回复
也来凑个热闹

=============================================
to 回复人: risingsoft(一苇渡江)
这样没什么效率的。我用存储过程写的
......
现有表:
员工考勤表(单位编号+员工编号+上班时间+...)

说明:无主键,此表在员工每日上班都会登记一次(纪录一条考勤纪录)
=============================================
to回复人: xinpingf(白开心) ( )
select *
from 员工考勤表
where (单位编号,员工编号,上班时间) in ( select 单位编号,员工编号,max(上班时间)
from 员工考勤表
group by 单位编号,员工编号)

=============================================
=============================================
人家risingsoft(一苇渡江)都说了,连主键都没有,怎么可能有索引呢?所以xinpingf(白开心)算是白写了,人家可是体会不到你那sql精妙所在的~~~~~~
hevin 2005-12-02
  • 打赏
  • 举报
回复
select A.*
from 员工考勤表 A
join (select 单位编号,员工编号,max(上班时间) 上班时间 from 员工考勤表 group by 单位编号,员工编号) A1 on (A.单位编号=A1.单位编号 and A.员工编号=A1.员工编号 and A.上班时间=A1.上班时间)
hevin 2005-12-02
  • 打赏
  • 举报
回复
这样写效率会高一点:

select A.*
from 员工考勤表 A
join (select 单位编号,员工编号,max(上班时间) 上班时间 from tab group by 单位编号,员工编号) A1 on (A.单位编号=A1.单位编号 and A.员工编号=A1.员工编号 and A.上班时间=A1.上班时间)

risingsoft 2005-12-02
  • 打赏
  • 举报
回复
这样没什么效率的。我用存储过程写的
xinpingf 2005-11-29
  • 打赏
  • 举报
回复
这也没什么难的啊,相信一个人不会有两条上班时间相同的吧?
xinpingf 2005-11-29
  • 打赏
  • 举报
回复
select *
from 员工考勤表
where (单位编号,员工编号,上班时间) in ( select 单位编号,员工编号,max(上班时间)
from 员工考勤表
group by 单位编号,员工编号)




SInoyew 2005-11-28
  • 打赏
  • 举报
回复

:)
risingsoft 2005-11-28
  • 打赏
  • 举报
回复
算了,只怪我没把需求说仔细。
就是我要做一个报表,查询我的一张流水表里最后一次操作的纪录,但是要求把所有字段都列出来的。
总不能把所有字段放到SELECT里面,然后又全放到GROUP BY里面吧,那样的话,可能每个人所有的交易纪录都会出来的,因为所有的字段组合起来,就不可能有重复的,分组也没意义了

flg_inwind 2005-11-26
  • 打赏
  • 举报
回复
交流ing
wuwen19 2005-11-26
  • 打赏
  • 举报
回复
select 单位编号,员工编号,max(上班时间) from tab group by 单位编号,员工编号


估计问题没有写完,应该不会这么简单。
cozmic 2005-11-25
  • 打赏
  • 举报
回复
我也来晕一下,
是不是楼主没写完就提交了问题?
hevin 2005-11-25
  • 打赏
  • 举报
回复
看来要晕死一大片
zxjnew 2005-11-25
  • 打赏
  • 举报
回复
来晚了 我看到晕了一地呢~!
yongz125 2005-11-24
  • 打赏
  • 举报
回复
晕到。
jsprite 2005-11-24
  • 打赏
  • 举报
回复
晕倒 简单的问题
加载更多回复(3)

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧