Re: [SQL ] 時間RowData轉甘特圖已刪文
select 人, 開始 = min(時間), 結束 = max(時間)
from TableA
group by 人
※ 引述《carsun00 (永夜)》之銘言:
: 資料庫名稱:SQL Server 2017
: 資料庫版本:14.0.2002.14
: 內容/問題描述:
: 資料來源是狀態&Time的資料表
: 需要轉換成開始與結束的資料格式
: 同時可能會有多筆開始多筆結束
: 要取出最早時間與最晚時間
: 是有想出一個堪用的語法...
: 但是想知道有沒有比較好的做法..
: 資料如下
: 狀態 | 人| 時間
: 進入 | AA| 2019-05-10 09:00:00.000
: 進入 | AA| 2019-05-10 09:00:00.000
: 進入 | AA| 2019-05-10 09:00:00.000
: 離開 | AA| 2019-05-10 18:00:00.000
: 離開 | AA| 2019-05-10 18:10:00.000
: 離開 | AA| 2019-05-10 19:00:00.000
: 離開 | AA| 2019-05-10 20:00:00.000
: 進入 | BB| 2019-05-10 10:00:00.000
: 進入 | BB| 2019-05-10 11:00:00.000
: 進入 | BB| 2019-05-10 11:30:00.000
: 離開 | BB| 2019-05-10 20:00:00.000
: 離開 | BB| 2019-05-10 20:00:00.000
: 離開 | BB| 2019-05-11 20:00:00.000
: 人| 開始 | 結束
: AA| 2019-05-10 09:00:00.000 | 2019-05-10 20:00:00.000
: BB| 2019-05-10 10:00:00.000 | 2019-05-11 20:00:00.000
: 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), [Update_Time], 111) AS [Start_Date_Time]
: FROM
: TableA
: GROUP BY
: [User]
: , CONVERT(VARCHAR(20), [Update_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), [Update_Time], 111) AS [End_Date_Time]
: FROM
: TableA
: GROUP BY
: [User]
: , CONVERT(VARCHAR(20), [Update_Time], 111)
: ) AS EndData
: ON StartData.[User] = EndData.[User]
: AND StartData.Num2 = EndData.Num3;
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.105.74
※ 文章網址: https://www.ptt.cc/bbs/Database/M.1558116438.A.565.html
推
05/18 11:59,
5年前
, 1F
05/18 11:59, 1F
→
05/18 12:00,
5年前
, 2F
05/18 12:00, 2F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 4 篇):
Database 近期熱門文章
PTT數位生活區 即時熱門文章