请考虑下表。用于检索打卡顺序中的差异的SQL查询
规则是 - 员工在计入工作数量2之前不能从工作数量1中休息(需要计时)。在这种情况下,员工“A”应该在工作数量上计时输出而不是BREAK 1,因为他后来登录到JobNum#2
是否可以编写一个查询来在普通SQL中查找?
请考虑下表。用于检索打卡顺序中的差异的SQL查询
规则是 - 员工在计入工作数量2之前不能从工作数量1中休息(需要计时)。在这种情况下,员工“A”应该在工作数量上计时输出而不是BREAK 1,因为他后来登录到JobNum#2
是否可以编写一个查询来在普通SQL中查找?
想法是检查下一个记录是正确的。为了找到下一个记录,必须为同一个员工找到当前的第一个冲床时间。一旦检索到这些信息,就可以分离记录本身并检查感兴趣的字段,具体来说,jobnum是相同的,[可选]是punch_type'IN'。如果不是,则不存在评估为真并记录输出。
select *
from @punch p
-- Isolate breaks only
where p.punch_type = 'BREAK'
-- The ones having no proper entry
and not exists
(
select null
-- The same table
from @punch a
where a.emplid = p.emplid
and a.jobnum = p.jobnum
-- Next record has punchtime from subquery
and a.punchtime = (select min (n.punchtime)
from @punch n
where n.emplid = p.emplid
and n.punchtime > p.punchtime
)
-- Optionally you might force next record to be 'IN'
and a.punch_type = 'IN'
)
用您的表名替换@punch。 --
是在Sql Server中的评论;如果您不使用此数据库,请删除此行。标记数据库和版本是一个好主意,因为可能有更快/更好的方法来做到这一点。
谢谢。这就像一个魅力! – BrickMan
这里是SQL
select * from employees e1 cross join employees e2 where e1.JOBNUM = (e2.JOBNUM + 1)
and e1.PUNCH_TYPE = 'BREAK' and e2.PUNCH_TYPE = 'IN'
and e1.PUNCHTIME < e2.PUNCHTIME
and e1.EMPLID = e2.EMPLID
如果你的引擎支持LEAD和LAG,那么你可以写一个不错的.. – Randy