Anda bisa menggunakan subselect atau CTE untuk mendapatkan data yang dipesan oleh karyawan dan menggunakannya sebagai tabel data utama. Sesuatu yang mirip (sesuaikan jika perlu) dengan ini:
;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
Penjelasan:CTE 'dipesan' memang menunjukkan entri/keluar karyawan yang dipesan berdasarkan tanggal. ROW_NUMBER
disetel ulang untuk setiap karyawan (saya berasumsi emp_reader_id memang berisi id karyawan) karena PARTITION BY
.
Setelah saya mendapatkan counter untuk setiap karyawan, saya menggabungkan setiap pukulan untuk setiap karyawan (kondisi pertama di gabung kiri) dengan pukulan berikutnya untuk karyawan itu (kondisi kedua di gabung kiri). Dengan begitu saya bisa menunjukkan kolom masuk dan keluar (pukulan berikutnya).
Setelah Anda mendapatkan kolom masuk dan keluar dalam data Anda, Anda mungkin ingin mengecualikan beberapa data (baris ganjil setiap karyawan adalah baris yang Anda inginkan) menambahkan WHERE entered.OrderedPunch %2 = 1