作者rockchangnew (rock)
看板Database
标题Re: [SQL ] cte 递回
时间Tue Feb 23 15:31:45 2016
※ 引述《bernachom (Terry)》之铭言:
: 资料库名称: 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
我是透过子查询做,不知是否合用
with tmp as
(select ROW_NUMBER() over(Partition by uID Order by uid,tDate) as N,* From tb_1)
select
a.userID,
a.uID,
a.tDate,
a.tDate as startDate,
(select b.tDate From tmp b Where b.uID=a.uID And b.N=a.N+1) as endDate,
seqNo
from tmp a order by seqNo
https://goo.gl/photos/Zo7pw1LrXfJF8EiZ8
https://goo.gl/photos/cyCccdSTZjH9iq7r9
--
Sent from my Windows
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.136.240.135
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1456212708.A.B4E.html