我正在嘗試將來自多行的一些休假請求合并為一行,以標識開始和結束時間。當前表類似于以下內容;
| ID | 每天幾小時 | 提交日期 | 申請日期 | 請求狀態 |
|---|---|---|---|---|
| '喬' | 8 | '2017-12-01' | '2017-12-05' | '得到正式認可的' |
| '喬' | 8 | '2017-12-01' | '2017-12-06' | '得到正式認可的' |
| '喬' | 4 | '2017-12-01' | '2017-12-07' | '拒絕' |
| '蘇西' | 8 | '2018-09-08' | '2017-12-24' | '得到正式認可的' |
| '蘇西' | 8 | '2018-09-08' | '2017-12-25' | '得到正式認可的' |
| '喬' | 2 | '2017-12-01' | '2017-12-7' | '得到正式認可的' |
我試圖將其濃縮為以下內容:
| ID | 全部小時數 | 提交日期 | 請求日期開始 | 請求日期結束 | 請求狀態 |
|---|---|---|---|---|---|
| 喬 | 16 | '2017-12-01' | '2017-12-05' | '2017-12-06' | 得到正式認可的 |
| 喬 | 4 | '2017-12-01' | '2017-12-07' | '2017-12-07' | 拒絕 |
| 蘇茜 | 16 | '2018-09-08' | '2017-12-24' | '2017-12-25' | 得到正式認可的 |
| 喬 | 2 | '2017-12-01' | '2017-12-07' | '2017-12-07' | 得到正式認可的 |
我已經嘗試了幾十種利用磁區的方法,但我真的一無所獲。有什么建議?
uj5u.com熱心網友回復:
這是一個缺口和孤島問題。假設您使用的是 MySQL 8 ,我們可以在此處使用行號差異方法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RequestedDate) rn1,
ROW_NUMBER() OVER (PARTITION BY ID, RequestedStatus
ORDER BY RequestedDate) rn2
FROM yourTable
)
SELECT ID, SUM(hoursperday) AS total_hours, SubmittedDate,
MIN(RequestedDate) AS rd_start, MAX(RequestedDate) AS rd_end,
RequestedStatus
FROM cte
GROUP BY ID, SubmittedDate, RequestedStatus, rn1 - rn2
ORDER BY ID, RequestedStatus, MIN(RequestedDate);

演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/403164.html
標籤:
上一篇:用月份名稱代替表名稱
