Объедините события из таблицы дат начала и окончания - PullRequest
1 голос
/ 09 марта 2020

У меня есть одна таблица, в которой записывается, был ли сотрудник включен и отключен, но отслеживает их как отдельные строки.

Ввод:

+------------+------------+---------------+
| EmployeeID | Event_Date | Event_Type    |
+------------+------------+---------------+
| 2450770    | 2020/01/02 | 'Clocked Out' | -- Doesn't have a clocked in time within desired time range
| 2195326    | 2020/01/06 | 'Clocked In'  |
| 2195326    | 2020/01/10 | 'Clocked Out' |
| 800455     | 2020/01/15 | 'Clocked In'  |
| 2450770    | 2020/01/15 | 'Clocked In'  | -- No clock out time yet
| 800455     | 2020/01/22 | 'Clocked Out' | 
| 2195326    | 2020/01/23 | 'Clocked In'  | 
| 2331340    | 2020/01/25 | 'Clocked In'  |
| 2195326    | 2020/01/27 | 'Clocked Out' |
| 2331340    | 2020/02/01 | 'Clocked Out' |
| 2515957    | 2020/02/05 | 'Clocked In'  |
|            |            |               | -- etc

Требуемый вывод:

+------------+------------+-------------+
| EmployeeID | Clocked_In | Clocked_Out |
+------------+------------+-------------+
| 2195326    | 2020/01/06 | 2020/01/10  |
| 800455     | 2020/01/15 | 2020/01/22  |
| 2450770    | 2020/01/15 | NULL        |
| 2195326    | 2020/01/23 | 2020/01/27  |
| 2331340    | 2020/01/25 | 2020/02/01  |
+------------+------------+-------------+

Эта проблема кажется достаточно простой, но я могу не совсем понятно: как мне присоединиться к тем событиям Clocked In и Clocked Out вместе, чтобы я мог видеть любого, кто синхронизировался в январе, с соответствующей датой закрытия (если она существует) без ограничения даты? Осложнения включают людей, не совпадающих с установленными и закрытыми датами, люди, включающие и выключающие в разные месяцы, включающие / выключающие несколько раз в месяц. Насколько я могу судить, не было случаев, когда люди включались дважды подряд (или дважды подряд).

1 Ответ

1 голос
/ 09 марта 2020

Примерно так получаются номера строк ваших данных, разделенные по EmployeeID и упорядоченные по Event_Date. Как только вы это получите, присоединитесь к идентификатору сотрудника и следующему номеру строки.

Если вы сделаете это таким образом, вы справитесь с большинством, если не со всеми вашими осложнениями, в том числе когда дата в часах больше, чем дата в часах.

DROP TABLE IF EXISTS #temp
CREATE TABLE #temp (EmployeeID VARCHAR(256), Event_Date DATE, Event_Type varchar(256))

INSERT INTO #temp
VALUES 
( '2450770', '2020/01/02', 'Clocked Out'),
( '2195326', '2020/01/06', 'Clocked In'),
( '2195326', '2020/01/10', 'Clocked Out'),
( '800455', '2020/01/15', 'Clocked In'), 
( '2450770', '2020/01/15', 'Clocked In'), 
( '800455', '2020/01/22', 'Clocked Out'),
( '2195326', '2020/01/23', 'Clocked In'), 
( '2331340', '2020/01/25', 'Clocked In'), 
( '2195326', '2020/01/27', 'Clocked Out'),
( '2331340', '2020/02/01', 'Clocked Out'),
( '2515957', '2020/02/05', 'Clocked In')

DROP TABLE IF EXISTS #output
SELECT 
    EmployeeID,
    Event_Date,
    Event_Type,
    ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY Event_Date) AS RN
INTO #output
FROM #temp

SELECT 
    I.EmployeeID, 
    I.Event_Date AS [Clocked In], 
    O.Event_Date AS [Clocked Out]
FROM #output I 
LEFT JOIN #output O ON O.EmployeeID + O.RN = I.EmployeeID + (I.RN + 1) AND O.Event_Type = 'Clocked Out'
WHERE I.Event_Type = 'Clocked In'
...