請考慮下表。用於檢索打卡順序中的差異的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