简体   繁体   中英

Looking for a way to consolidate multiple rows of time off requests to ranges in one row based off dates requested

I'm attempting to consolidate some Time off requests from multiple rows into one row which identifies the start and end time. The current table looks similar to the following;

ID hours per day Submitted Date Requested Date Requested Status
'Joe' 8 '2017-12-01' '2017-12-05' 'Approved'
'Joe' 8 '2017-12-01' '2017-12-06' 'Approved'
'Joe' 4 '2017-12-01' '2017-12-07' 'Declined'
'suzie' 8 '2018-09-08' '2017-12-24' 'Approved'
'suzie' 8 '2018-09-08' '2017-12-25' 'Approved'
'Joe' 2 '2017-12-01' '2017-12-7' 'Approved'

I'm trying to condense this into the following:

ID Total Hours Submitted Date Requested Date Start Requested Date End Requested Status
Joe 16 '2017-12-01' '2017-12-05' '2017-12-06' Approved
Joe 4 '2017-12-01' '2017-12-07' '2017-12-07' Declined
suzie 16 '2018-09-08' '2017-12-24' '2017-12-25' Approved
Joe 2 '2017-12-01' '2017-12-07' '2017-12-07' Approved

I've tried dozens of things utilizing partitions but i'm not really getting anywhere. Any suggestions?

This is a gaps and islands problem. Assuming you are using MySQL 8+ we can use the difference in row numbers method here:

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);

下面演示链接的屏幕截图

Demo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM