我有下表,我需要将第1行与第2行匹配,第3行与第4行匹配等等。
Userid, CheckTime
------------------------------
90119, 2014-05-08 11:03:09.000
90119, 2014-05-08 11:47:05.000
90119, 2014-05-12 22:10:39.000
90119, 2014-05-12 22:41:35.000
90119, 2014-05-13 00:58:26.000
90119, 2014-05-13 01:03:25.000
90119 | 2014-05-13 22:11:49.000
90119 | 2014-05-13 22:42:07.000
我需要做一个会产生以下结果的查询:
Userid, CheckTimeA, ChecktimeB
---------------------------------------------
90119, 2014-05-08 11:03:09.000, 2014-05-08 11:47:05.000
90119, 2014-05-12 22:10:39.000, 2014-05-12 22:41:35.000
90119, 2014-05-13 00:58:26.000, 2014-05-13 01:03:25.000
90119, 2014-05-13 22:11:49.000, 2014-05-13 22:42:07.000
答案 0 :(得分:0)
SELECT Userid, CheckTime, Ordinal = ROW_NUMBER() OVER ( PARTITION BY Userid ORDER BY CheckTime )
INTO #times
FROM insert_your_table_name_here;
SELECT t_odds.Userid, CheckTimeA = t_odds.CheckTime, CheckTimeB = t_evens.CheckTime
FROM #times t_odds
JOIN #times t_evens
ON t_odds.Userid = t_evens.Userid
AND t_odds.Ordinal + 1 = t_evens.Ordinal
WHERE t_odds.Ordinal % 2 = 1;
DROP TABLE #times;
答案 1 :(得分:0)
依靠实际表中的相应记录存储为顺序对(1-2,3-4,5-6等)我建议你使用CTE:
;WITH
startTime as (
SELECT Userid, CheckTime, ID = ROW_NUMBER() OVER ( PARTITION BY Userid ORDER BY CheckTime )
from dbo.UserCheckLog
where ID % 2 = 1 )
,
endTime as (
SELECT Userid, CheckTime, ID = ROW_NUMBER() OVER ( PARTITION BY Userid ORDER BY CheckTime )
from dbo.UserCheckLog
where ID % 2 = 0)
select startTime.UserID, startTime.CheckTime as CheckTimeA, endTime.CheckTime as CheckTimeB
from startTime
left join endTime on startTime.ID = endTime.ID + 1
(只需将实际的表名改为'dbo.UserCheckLog')。