|
| 1 | + |
| 2 | +/* |
| 3 | +
|
| 4 | +-- Create the EmployeeAttendance table |
| 5 | +CREATE TABLE EmployeeAttendance ( |
| 6 | + EmployeeID VARCHAR(10), |
| 7 | + Date DATE, |
| 8 | + Status VARCHAR(10) |
| 9 | +); |
| 10 | +
|
| 11 | +-- Input |
| 12 | +
|
| 13 | +INSERT INTO EmployeeAttendance (EmployeeID, Date, Status) VALUES |
| 14 | +('A1', '2024-01-01', 'PRESENT'), |
| 15 | +('A1', '2024-01-02', 'PRESENT'), |
| 16 | +('A1', '2024-01-03', 'PRESENT'), |
| 17 | +('A1', '2024-01-04', 'ABSENT'), |
| 18 | +('A1', '2024-01-05', 'PRESENT'), |
| 19 | +('A1', '2024-01-06', 'PRESENT'), |
| 20 | +('A1', '2024-01-07', 'ABSENT'), |
| 21 | +('A1', '2024-01-08', 'ABSENT'), |
| 22 | +('A1', '2024-01-09', 'ABSENT'), |
| 23 | +('A1', '2024-01-10', 'PRESENT'), |
| 24 | +('A2', '2024-01-06', 'PRESENT'), |
| 25 | +('A2', '2024-01-07', 'PRESENT'), |
| 26 | +('A2', '2024-01-08', 'ABSENT'), |
| 27 | +('A2', '2024-01-09', 'PRESENT'), |
| 28 | +('A2', '2024-01-10', 'ABSENT'); |
| 29 | +
|
| 30 | +
|
| 31 | +-- Output |
| 32 | +
|
| 33 | +EMPLOYEE | FROM_DATE | TO_DATE | STATUS |
| 34 | +-------------------------------------------- |
| 35 | +A1 | 2024-01-01 | 2024-01-03 | PRESENT |
| 36 | +A1 | 2024-01-04 | 2024-01-04 | ABSENT |
| 37 | +A1 | 2024-01-05 | 2024-01-06 | PRESENT |
| 38 | +A1 | 2024-01-07 | 2024-01-09 | ABSENT |
| 39 | +A1 | 2024-01-10 | 2024-01-10 | PRESENT |
| 40 | +A2 | 2024-01-06 | 2024-01-07 | PRESENT |
| 41 | +A2 | 2024-01-08 | 2024-01-08 | ABSENT |
| 42 | +A2 | 2024-01-09 | 2024-01-09 | PRESENT |
| 43 | +A2 | 2024-01-10 | 2024-01-10 | ABSENT |
| 44 | +
|
| 45 | +*/ |
| 46 | + |
| 47 | +with cte as (select |
| 48 | + EmployeeID, |
| 49 | + Date, |
| 50 | + Status, |
| 51 | + date - CAST(ROW_NUMBER() OVER (ORDER BY date) AS INT) AS diff |
| 52 | +from EmployeeAttendance) |
| 53 | +select |
| 54 | + EmployeeID, |
| 55 | + Status, |
| 56 | + diff, |
| 57 | + date, |
| 58 | + row_number() over(partition by EmployeeID, Status order by date) |
| 59 | +from cte |
| 60 | +-- group by EmployeeID, Status, diff |
| 61 | +-- order by 3 desc |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | +-- SELECT |
| 66 | +-- EmployeeID, |
| 67 | +-- STRING_AGG(Date::text, ', ') AS Dates, |
| 68 | +-- Status |
| 69 | +-- FROM |
| 70 | +-- EmployeeAttendance |
| 71 | +-- GROUP BY |
| 72 | +-- EmployeeID, |
| 73 | +-- Status; |
0 commit comments