T-SQL查询将下一行与列匹配

时间:2014-05-16 02:39:27

标签: sql-server tsql

我有下表,我需要将第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

2 个答案:

答案 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')。