Můžete použít podvýběr nebo CTE k získání dat seřazených podle zaměstnance a použít je jako hlavní datovou tabulku. Něco podobného (v případě potřeby si to upravte):
;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
Vysvětlení:'Objednaný' CTE zobrazuje vstupy/výstupy zaměstnanců seřazené podle data. ROW_NUMBER
je resetováno pro každého zaměstnance (předpokládám, že emp_reader_id obsahuje id zaměstnance) kvůli PARTITION BY
.
Jakmile mám počítadlo pro každého zaměstnance, spojím každý úder pro každého zaměstnance (první podmínka v levém spojení) s dalším úderem pro tohoto zaměstnance (druhá podmínka v levém spojení). Tímto způsobem mohu zobrazit vstupní sloupec a výstup (další úder).
Poté, co ve svých datech získáte vstupní a výstupní sloupce, možná budete chtít některá data vyloučit (liché řádky každého zaměstnance jsou řádky, které byste chtěli) přidáním WHERE entered.OrderedPunch %2 = 1