当前位置: 代码迷 >> Sql Server >> T-SQL语句有有关问题请问
  详细解决方案

T-SQL语句有有关问题请问

热度:74   发布时间:2016-04-24 10:55:54.0
T-SQL语句有问题请教
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进行配对。

请各位给支支招,多谢。
------解决方案--------------------
引用:
Quote: 引用:

单纯从数据的角度这种情况,我也没有看到规律来区分它 。

应该是有个批次号。

设置批次号,然后一次一次插入,当下一批次的时候,更新批次号再插入。

这种直接靠数据区分,又没有明确的规律,强行处理也会产生很多弊端。

我再详细描述一下,

需求是:最小的IN和最后一个OUT匹配。

所谓最小的IN其实是:大于前一条IN和OUT配对的记录中最小的IN。

所谓最后一个OUT是:该OUT下面那条记录中的OUT为NULL或者该OUT下面那条记录中的IN和OUT都不为NULL。

不知描述的内容大师是否能看明白……

我觉得是有规律可寻的,可就是写不出来,求大师再指点一下。


勉强能写,但是长此以往不是办法呀...


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
----------- ---------- ---------- ----------------------- -----------------------
  相关解决方案