Prova detta:
;with cte as
(select *, rank() over(partition by ID_Emp order by [Date]) rn
from attendance)
select src.ID_Emp, src.Name, convert(date, src.[Date]) as [Date],
concat(datepart(hour,src.[Date]),':',datepart(minute,src.[Date])) as [TimeIn],
concat(datepart(hour,tgt.[Date]),':',datepart(minute,tgt.[Date])) as [TimeOut],
concat(datediff(minute,src.[Date],tgt.[Date])/60,':',datediff(minute,src.[Date],tgt. [Date])%60) as [Hours]
from cte src
inner join cte tgt on src.ID_Emp = tgt.ID_Emp and src.rn + 1 = tgt.rn and src.rn % 2 = 1
Varning:Jag har endast testat detta på SQL Server 2008 R2, men jag antar att det också borde fungera på Oracle med lämpliga ändringar.
Förklaring:Vi använder RANK
funktion för att beställa efter datum och tid för varje ID_Emp
. Sedan går vi med på ID
och få par av rader. Slutligen, för att säkerställa att vi inte väljer varje par av på varandra följande rader, ställer vi som ett krav att källradens rangordning ska vara udda.