Я хочу заменить значение даты для каждого сотрудника - PullRequest
0 голосов
/ 05 мая 2020

У меня есть этот файл в excel. Мне нужно преобразовать его. Для определенного Personnum и для определенной даты я хочу проверить, отсутствует ли ENDREASON или отсутствует. Если он пропущен, то дата ENDDTM предыдущей записи. т.е. последняя исходящая запись будет рассматриваться как StartDTM для значения missedOut. Можно ли как-нибудь закодировать его в python или SQL? В любом случае я могу сделать это в Databricks? enter image description here

1 Ответ

0 голосов
/ 03 июня 2020

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

CREATE TABLE foo1 
(
    APPLYDATE datetime,
    STARTDTM datetime,
    ENDDTM datetime,
    PERSONNUM int,
    STARTREASON varchar(100),
    ENDREASON varchar(100) 
) 

select getdate()

INSERT INTO foo1 
VALUES ('2020-04-23 00:00:00.000','2020-04-23 06:30:47.223','2020-04-23 10:10:47.223',204901477,'newshift','out')
INSERT INTO foo1 
VALUES ('2020-04-23 00:00:00.000','2020-04-23 21:45:47.223','2020-04-23 21:45:47.223',204901477,'newshift','missedout')
INSERT INTO foo1 
VALUES ('2020-04-23 00:00:00.000','2020-04-23 10:10:47.223','2020-04-23 12:15:47.223',204901477,'newshift','out')

INSERT INTO foo1 
VALUES ('2020-04-24 00:00:00.000','2020-04-24 06:30:47.223','2020-04-24 10:10:47.223',204901478,'newshift','out')
INSERT INTO foo1 
VALUES ('2020-04-24 00:00:00.000','2020-04-24 21:45:47.223','2020-04-24 21:45:47.223',204901478,'newshift','missedout')
INSERT INTO foo1 
VALUES ('2020-04-24 00:00:00.000','2020-04-24 10:10:47.223','2020-04-24 12:15:47.223',204901478,'newshift','out')


SELECT
    aa.PERSONNUM,
    ENDDTM = CASE 
                WHEN aa.ENDREASON = 'missedout' THEN bb.ENDDTM
                ELSE aa.ENDDTM
             END
FROM
    (SELECT
         ROW_NUMBER() OVER (PARTITION BY PERSONNUM ORDER BY PERSONNUM) AS id1,
         *
     FROM
         foo1) aa 
JOIN 
    (SELECT
         ROW_NUMBER() OVER (PARTITION BY PERSONNUM ORDER BY PERSONNUM) + 1  AS id2,
         *
     FROM
         foo1) bb ON aa.id1 = bb.id2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...