2012-06-06 30 views
1

请考虑下表。用于检索打卡顺序中的差异的SQL查询

规则是 - 员工在计入工作数量2之前不能从工作数量1中休息(需要计时)。在这种情况下,员工“A”应该在工作数量上计时输出而不是BREAK 1,因为他后来登录到JobNum#2

是否可以编写一个查询来在普通SQL中查找?

table

+0

如果你的引擎支持LEAD和LAG,那么你可以写一个不错的.. – Randy

回答

1

想法是检查下一个记录是正确的。为了找到下一个记录,必须为同一个员工找到当前的第一个冲床时间。一旦检索到这些信息,就可以分离记录本身并检查感兴趣的字段,具体来说,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中的评论;如果您不使用此数据库,请删除此行。标记数据库和版本是一个好主意,因为可能有更快/更好的方法来做到这一点。

+0

谢谢。这就像一个魅力! – BrickMan

1

这里是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 
+0

太棒了!非常感谢。 – BrickMan

+0

如果某人有JOB1中的BREAK-IN- BREAK-OUT-OUT和JOB2中的IN-OUT,则即使对于有效行,查询也会返回true。有任何想法吗? – BrickMan