以下の表を検討してください。
ルールは次のとおりです。従業員は、ジョブ番号2にクロックインする前に、ジョブ番号1から休憩を取る(クロックアウトする必要がある)ことはできません。この場合、従業員「A」は、ジョブ番号1でBREAKではなくクロックアウトすることになっています。 JobNum#2にクロックイン
プレーンSQLでこれを見つけるためのクエリを書くことは可能ですか?
以下の表を検討してください。
ルールは次のとおりです。従業員は、ジョブ番号2にクロックインする前に、ジョブ番号1から休憩を取る(クロックアウトする必要がある)ことはできません。この場合、従業員「A」は、ジョブ番号1でBREAKではなくクロックアウトすることになっています。 JobNum#2にクロックイン
プレーンSQLでこれを見つけるためのクエリを書くことは可能ですか?
これが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
アイデアは、次のレコードが適切なものかどうかを確認することです。次のレコードを見つけるには、同じ従業員の現在の後の最初のパンチタイムを見つける必要があります。この情報が取得されると、レコード自体を分離し、関心のあるフィールドをチェックできます。具体的には、jobnum は同じで、[オプションで]punch_type 'IN' です。そうでない場合、not exists は true と評価され、レコードが出力されます。
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 のコメントです。このデータベースを使用していない場合は、この行を削除してください。データベースとバージョンにタグを付けることをお勧めします。これを行うためのより高速で優れた方法がおそらくあるからです。