Найти дату начала и дату окончания по часам сотрудника - PullRequest
1 голос
/ 16 октября 2019

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

PersonID  EventTime                       ActivityCode
1         2019-07-29 00:03:03.000         7
1         2019-07-29 00:09:41.000         0
1         2019-07-29 00:01:07.000         7
1         2019-07-29 00:01:19.000         0

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

PersonID  EventTime                   EndTime                           ActivityCode
1         2019-07-29 00:03:03.000     2019-07-29 00:09:41.000            7
1         2019-07-29 00:09:41.000     2019-07-29 00:01:07.000            0
1         2019-07-29 00:01:07.000      2019-07-29 00:01:19.000           7
1         2019-07-29 00:01:19.000                                        0

Мне нужно найти дату начала и дату окончания человека на основе времени события и кода активности. Начальной датой будет столбец времени события, и мне нужно вычислить конечную дату из того же столбца, который является следующим временем события в строке.

Я пытался использовать ведущую функцию в T-SQL, но она не дает мнеЯ хочу получить результат.

select personid, activitycode, eventtime as starttime
    , (lead(eventtime) over (order by personid)) as endtime 
from ActivityTable

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

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Я подозреваю, что ваш EventTime должен быть 13:00, а не 01: 00

Пример

Declare @YourTable Table ([PersonID] varchar(50),[EventTime] datetime,[ActivityCode] int)  Insert Into @YourTable Values 
 (1,'2019-07-29 00:03:03.000',7)
,(1,'2019-07-29 00:09:41.000',0)
,(1,'2019-07-29 00:13:07.000',7)  << changed to 13
,(1,'2019-07-29 00:13:19.000',0)  << changed to 13

Select PersonID
      ,EventTime 
      ,EndTime= lead([EventTime],1) over (partition by [PersonID] order by [EventTime])
      ,ActivityCode
 From @YourTable
 Order by EventTime

Возвраты

PersonID    EventTime                 EndTime                   ActivityCode
1           2019-07-29 00:03:03.000   2019-07-29 00:09:41.000   7
1           2019-07-29 00:09:41.000   2019-07-29 00:13:07.000   0
1           2019-07-29 00:13:07.000   2019-07-29 00:13:19.000   7
1           2019-07-29 00:13:19.000   NULL                      0
0 голосов
/ 17 октября 2019

Попробуйте вот так ..

  CREATE TABLE #T 
 (
PersonID INT
,EventTime DATETIME
,ActivityCode INT
)



INSERT INTO #T(
PersonID
,EventTime
,ActivityCode
)
SELECT
PersonID
,EventTime
,ActivityCode
FROM
(VALUES ( 1,'2019-07-29 00:03:03.000', 7)
        ,(1,'2019-07-29 00:09:41.000', 0)
        ,(1,'2019-07-29 00:13:07.000', 7)
        ,(1,'2019-07-29 00:13:19.000', 0)) AS T (PersonID,EventTime,ActivityCode)

SELECT  PersonID,EventTime,ActivityCode,
    (SELECT MIN(EventTime) FROM #T T2 WHERE T1.PersonID = T2.PersonID AND 
    T1.EventTime < T2.EventTime)
  FROM  #T T1
0 голосов
/ 17 октября 2019

Ваш вывод выглядит довольно странно в вашем примере, поскольку ваш EventTime, кажется, происходит после вашего EndTime. Если вы ищете порядок времени и ожидаете результирующий набор, подобный этому:

enter image description here

Тогда комментарий xQbert верен. Вам нужно только добавить EventTime в ваш Order By. Смотрите пример кода ниже.

CREATE TABLE #T (
    PersonID INT
    ,EventTime DATETIME
    ,ActivityCode INT
)

INSERT INTO #T(
    PersonID
    ,EventTime
    ,ActivityCode
)
SELECT
    PersonID
    ,EventTime
    ,ActivityCode
FROM
    (VALUES ( 1,'2019-07-29 00:03:03.000', 7)
            ,(1,'2019-07-29 00:09:41.000', 0)
            ,(1,'2019-07-29 00:01:07.000', 7)
            ,(1,'2019-07-29 00:01:19.000', 0)) AS T (PersonID,EventTime,ActivityCode)


SELECT
    PersonID
    ,ActivityCode
    ,EventTime AS starttime
    ,(LEAD(EventTime) OVER (ORDER BY PersonID, EventTime DESC)) AS endtime
FROM
    #T;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...