作者bernachom (Terry)
看板Database
标题[SQL ] cte 递回
时间Sun Feb 21 10:30:27 2016
资料库名称: sql server 2008 r2
资料库版本: 2008 r2
内容/问题描述:
请教一下,
我有一个table是长这个样子
useriD uID tDate startDate endDate seqNo
AAAA ZZ 2016-02-21 NULL NULL 1
BBBB ZZ 2016-02-25 NULL NULL 2
CCCC VV 2016-02-25 NULL NULL 3
我希望整理後最後的结果是
userID uID tDate startDate endDate seqNo
AAAA ZZ 2016-02-21 2016-02-21 2016-02-25 1
BBBB ZZ 2016-02-25 2016-02-25 NULL 2
CCCC VV 2016-02-25 2016-02-25 NULL 3
uID 、 userID、tDate 为key值
我要找出每一个uID的有效区间 (startDate, endDate)
如果uID只有一笔的时後,他就还没有结束 endDate 就会是null
如果uid有两笔以上的时後,次笔的tDate(产生uid时间),就会更新到目前这一笔的endDate
我用cte去跑,结果一直超出100笔
不知道是什麽条件没有下好..
希望前辈能教导一下
然後我发烧了,好难过...唉,希望今天会好转..
[更新]
(今天什麽事都做不了,烧得好厉害呀,唉...现在也还在咳)
刚才我用了简单的更新就做完了,我搞得太复杂了
--排序
SELECT ROW_NUMBER() OVER(ORDER BY id,aa) AS ROWID, *
INTO #TEMP
FROM [资料来源]
ORDER BY userid,id,aa
--更新
UPDATE
T
SET T.enddate=OT.startdate
FROM #TEMP AS T LEFT JOIN #TEMP AS OT
on T.ROWID=OT.ROWID-1
AND T.ID=OT.ID
--结果
SELECT *
FROM #TEMP
--删除
DROP TABLE #TEMP
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.231.18.92
※ 编辑: bernachom (61.231.18.92), 02/21/2016 10:31:03
1F:→ bernachom: 我是在想,如果要更新时间区间,在程式端做会不会比较 02/21 14:33
2F:→ bernachom: 好呢?? 02/21 14:33
3F:→ bernachom: CTE好像没有什麽机会的样子,我看看XML行不行... 02/21 19:02
※ 编辑: bernachom (61.231.18.92), 02/21/2016 19:56:54