副選択またはCTEを使用して、従業員によって順序付けられたデータを取得し、それをメインデータテーブルとして使用できます。これに似たもの(必要に応じて適応):
;with ordered as (
select
emp_reader_id as empId,
CONVERT(DATE, dt) as Punch,
Row_number()
OVER (PARTITION BY emp_reader_id ORDER BY CONVERT(DATE, dt) ASC) as OrderedPunch
from trnevents
)
SELECT
entered.empId,
entered.Punch as PunchIn,
exited.Punch as PunchOut
from
ordered as entered
left join ordered as exited on
entered.empId = exited.empId
and entered.OrderedPunch + 1 = exited.OrderedPunch
説明:「注文済み」CTEには、日付順に注文された従業員の出入りが表示されます。 ROW_NUMBER
PARTITION BY
が原因で、従業員ごとにリセットされます(emp_reader_idには従業員IDが含まれていると思います)。 。
各従業員のカウンターを取得したら、各従業員の各パンチ(左結合の最初の条件)とその従業員の次のパンチ(左結合の2番目の条件)を結合します。そうすれば、入口の列と出口(次のパンチ)を表示できます。
データに入力列と出力列を取得した後、一部のデータを除外したい場合があります(各従業員の奇数行は必要な行です)。WHERE entered.OrderedPunch %2 = 1
を追加します。