2012-06-06 63 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