Можете да използвате подизбор или 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
се нулира за всеки служител (предполагам, че emp_reader_id съдържа идентификатора на служителя) поради PARTITION BY
.
След като получа брояча за всеки служител, свързвам всеки удар за всеки служител (първо условие в лявото съединение) със следващия удар за този служител (второ условие в лявото съединение). По този начин мога да покажа колоната за влизане и изхода (следващия удар).
След като получите входните и изходящите колони във вашите данни, може да искате да изключите някои данни (нечетните редове на всеки служител са редовете, които бихте искали), като добавите WHERE entered.OrderedPunch %2 = 1