Bạn có thể sử dụng một lựa chọn con hoặc CTE để lấy dữ liệu theo thứ tự của nhân viên và sử dụng nó làm bảng dữ liệu chính. Một cái gì đó tương tự (điều chỉnh nó nếu cần thiết) với cái này:
;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
Giải thích:CTE 'được đặt hàng' hiển thị các lần ra / vào của nhân viên được sắp xếp theo ngày. ROW_NUMBER
được đặt lại cho từng nhân viên (tôi giả sử emp_reader_id có chứa id nhân viên) vì PARTITION BY
.
Khi tôi đã nhận được bộ đếm cho mỗi nhân viên, tôi tham gia từng cú đấm cho từng nhân viên (điều kiện đầu tiên trong phép nối bên trái) với cú đấm tiếp theo cho nhân viên đó (điều kiện thứ hai trong phép nối bên trái). Bằng cách đó, tôi có thể hiển thị cột mục nhập và lối ra (cú đấm tiếp theo).
Sau khi bạn có các cột vào và cột ra trong dữ liệu của mình, bạn có thể muốn loại trừ một số dữ liệu (các hàng lẻ của mỗi nhân viên là các hàng bạn muốn) thêm WHERE entered.OrderedPunch %2 = 1