Я предполагаю, что у вас есть последовательные события IN
и OUT
для каждого пользователя, упорядочите по дате правильно (не так, как в данных вашего примера).
Вы можете использовать ROW_NUMBER
для группировки событий IN
и OUT
в пары, например:
SELECT ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) + ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) % 2 AS [PairID]
,*
FROM [dbo].[TimeLog];
, а затем PIVOT
, чтобы получить следующий результат:
SELECT [User]
,[IN]
,[OUT]
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) + ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Time]) % 2 AS [PairID]
,*
FROM [dbo].[TimeLog]
) DS
PIVOT
(
MAX([Time]) FOR [Event] IN ([IN], [OUT])
) PVT
ORDER BY [PairID];
Примечание. Я изменил одно из ваших IN
событийдо OUT
для очистки данных.Если это не правильно в вашем реальном примере, я думаю, вы все еще можете использовать логику выше.Например, с вашими примерами данных получено максимальное событие IN
, которое не имеет события OUT
:
Вы можете играть сизмените код MAX
на MIN
или дополните его своей бизнес-логикой.