1

考虑下表。

规则是 - 员工在打卡到工作编号 2 之前不能从工作编号 1 休息(需要下班)。在这种情况下,员工“A”应该在工作编号 1 上打卡而不是休息,因为他后来打卡到 JobNum#2

是否可以编写查询以在普通 SQL 中找到它?

桌子

4

2 回答 2

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
于 2012-06-06T02:42:34.957 回答
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 中的注释;如果您不使用此数据库,请删除此行。标记您的数据库和版本是一个好主意,因为可能有更快/更好的方法来做到这一点。

于 2012-06-06T12:14:17.083 回答