看板 Database 關於我們 聯絡資訊
;with tb1 as ( select User,SEQ,Time, num = row_number() over (partition by User,SEQ order by Time) from test ) select t1.User,t1.SEQ, 開始 = t1.Time, 結束 = isnull(t2.Time,getdate()) from tb1 t1 left join tb1 t2 on t1.User = t2.User and t1.SEQ + 1 = t2.SEQ and t1.num = t2.num where t1.num = 1 ※ 引述《carsun00 (永夜)》之銘言: : 資料庫名稱:SQL Server 2017 : 資料庫版本:14.0.2002.14 : 內容/問題描述: : 資料來源是狀態&Time的資料表 : 需要轉換成開始與結束的資料格式 : 同時可能會有多筆開始多筆結束 : 要取出最早時間與最晚時間 : 是有想出一個堪用的語法... : 但是想知道有沒有比較好的做法.. : 資料如下 : User SEQ Time : AA 1 2019-05-10 09:00:00.000 : AA 1 2019-05-10 20:00:00.000 : AA 2 2019-05-11 10:00:00.000 : AA 2 2019-05-11 20:00:00.000 : 人| Seq|開始 | 結束 : AA| 1 |2019-05-10 09:00:00.000 | 2019-05-11 10:00:00.000 : AA| 2 |2019-05-11 10:00:00.000 | 現在時間 : seq2的起始時間要當作 seq1的結束時間。 : 沒有下一筆資料,抓現在GetDate() : SQL語法如下 : SELECT : StartData.[User] : , StartData.[Start_Date_Time] : , EndData.[End_Date_Time] : FROM : ( SELECT : ROW_NUMBER() OVER(PARTITION BY [User] ORDER BY : CONVERT(VARCHAR(20), [Time], 111)) AS Num : , 1 + ROW_NUMBER() OVER(PARTITION BY [User] ORDER BY : CONVERT(VARCHAR(20), [Time], 111)) AS Num2 : , [User] : , CONVERT(VARCHAR(20), [Time], 111) AS [Start_Date_Time] : FROM : [TEST] : GROUP BY : [User] : , CONVERT(VARCHAR(20), [Time], 111) : ) AS StartData : LEFT JOIN : ( SELECT : ROW_NUMBER() OVER(PARTITION BY [User] ORDER BY : CONVERT(VARCHAR(20), [Time], 111)) AS Num3 : , [User], CONVERT(VARCHAR(20), [Time], 111) AS [End_Date_Time] : FROM : [TEST] : GROUP BY : [User] : , CONVERT(VARCHAR(20), [Time], 111) : ) AS EndData : ON StartData.[User] = EndData.[User] : AND StartData.Num2 = EndData.Num3 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.118.82.245 ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1558176131.A.8F3.html ※ 編輯: cutekid (122.118.82.245), 05/18/2019 18:52:17
carsun00: 謝謝協助 05/22 18:03