CREATE TABLE #TMP
(
ID INT IDENTITY(1,1),
USERID INT,
INDATE DATE,
OUTDATE DATE,
INDATETIME DATETIME,
OUTDATETIME DATETIME
)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:01',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:02',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:03',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:05','2014-04-22 10:00')
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22',NULL,'2014-04-22 10:05')
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 10:30',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 10:35','2014-04-22 11:00')
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23','2014-04-23 13:00',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23','2014-04-23 13:20',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23','2014-04-23 13:20','2014-04-23 13:59')
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23',NULL,'2014-04-23 14:00')
SELECT * FROM #TMP
--要实现的效果
SELECT 1,'2014-04-22','2014-04-22','2014-04-22 9:01','2014-04-22 10:05'
UNION ALL
SELECT 1,'2014-04-22','2014-04-22','2014-04-22 10:30','2014-04-22 11:00'
UNION ALL
SELECT 1,'2014-04-23','2014-04-23','2014-04-23 13:00','2014-04-23 14:00'
以上是数据库结构和模拟数据的创建语句,简单描述就是第一条INDATETIME和最后一条OUTDATETIME进行配对。
请各位给支支招,多谢。
------解决方案--------------------
勉强能写,但是长此以往不是办法呀...
CREATE TABLE #TMP
(
ID INT IDENTITY(1,1),
USERID INT,
INDATE DATE,
OUTDATE DATE,
INDATETIME DATETIME,
OUTDATETIME DATETIME
)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:01',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:02',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:03',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 9:05','2014-04-22 10:00')
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22',NULL,'2014-04-22 10:05')
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 10:15','2014-04-22 10:20')
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 10:30',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-22','2014-04-22','2014-04-22 10:35','2014-04-22 11:00')
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23','2014-04-23 13:00',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23','2014-04-23 13:20',NULL)
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23','2014-04-23 13:20','2014-04-23 13:59')
INSERT INTO #TMP VALUES( 1,'2014-04-23','2014-04-23',NULL,'2014-04-23 14:00')
;with m1 as
(
SELECT
ROW_NUMBER() over (order by a.id ) as rid,a.*
FROM #TMP a
left join #TMP b on a.id=b.id+1
where (a.OUTDATEtime is null and b.OUTDATEtime is not null) or b.id is null or (a.OUTDATEtime is not null and a.INDATETIME is not null and b.OUTDATETIME is not null)
),
m2 as
(
SELECT
ROW_NUMBER() over (order by a.id ) as rid,a.*
FROM #TMP a
left join #TMP b on a.id=b.id-1
where (b.OUTDATEtime is null and a.OUTDATEtime is not null) or
(a.OUTDATEtime is not null and b.OUTDATETIME is not null and b.INDATETIME is not null)
)
select m1.USERID,m1.INDATE,m2.OUTDATE,m1.INDATETIME,m2.OUTDATETIME from m2 left join m1 on m2.rid=m1.rid
/*
USERID INDATE OUTDATE INDATETIME OUTDATETIME
----------- ---------- ---------- ----------------------- -----------------------