Vous pouvez utiliser une sous-sélection ou CTE pour obtenir les données classées par employé et les utiliser comme table de données principale. Quelque chose de similaire (adaptez-le si nécessaire) à ceci :
;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
Explication :Le CTE "ordonné" affiche les entrées/sorties d'employés classées par date. Le ROW_NUMBER
est réinitialisé pour chaque employé (je suppose que emp_reader_id contient l'identifiant de l'employé) en raison de la PARTITION BY
.
Une fois que j'ai obtenu le compteur pour chaque employé, je joins chaque poinçon pour chaque employé (première condition dans la jointure de gauche) avec le poinçon suivant pour cet employé (deuxième condition dans la jointure de gauche). De cette façon, je peux afficher la colonne d'entrée et la sortie (le poinçon suivant).
Après avoir obtenu les colonnes d'entrée et de sortie dans vos données, vous voudrez peut-être exclure certaines données (les lignes impaires de chaque employé sont les lignes que vous voudriez) en ajoutant WHERE entered.OrderedPunch %2 = 1