Re: [SQL ] 時間RowData轉甘特圖

作者: cutekid (可愛小孩子)   2019-05-18 18:42:10
;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
作者: carsun00 (永夜)   2019-05-22 18:03:00
謝謝協助

Links booklink

Contact Us: admin [ a t ] ucptt.com