Re: [SQL ] cte 遞迴

看板Database (資料庫)作者 (rock)時間8年前 (2016/02/23 15:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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://www.ptt.cc/bbs/Database/M.1456212708.A.B4E.html
文章代碼(AID): #1Mp0hajE (Database)
討論串 (同標題文章)
本文引述了以下文章的的內容:
0
3
完整討論串 (本文為第 2 之 2 篇):
0
3
文章代碼(AID): #1Mp0hajE (Database)