Re: [SQL ] cte 遞迴
※ 引述《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
討論串 (同標題文章)
Database 近期熱門文章
PTT數位生活區 即時熱門文章