2017-02-21 39 views
1

Мне нужен запрос для сопряжения чередующихся данных «старт» и «конец» раз в один аккуратный вывод, но мое основное препятствие заключается в том, как данные хранятся в чередующемся формате в пределах ProcessTimer таблица.Запрос на пару чередующихся начальных и конечных времен

Входной таблице 1

У меня есть таблица с именем ProcessTimer с тремя столбцами.

  • ProcessTimerId INT (первичный ключ)
  • ProcessTimerDatetime DATETIME
  • ProcessTimerAction УАКСНАК (5)
  • ProcessId INT (FOREIGN KEY)

'ProcessTimerAction «только когда-либо устанавливается на значение„START“или„СТОП“, которая связывает в к» ProcessTimerDatetime «колонку, потому что» ProcessTimerDatetime 'хранит значение DATETIME о том, когда процесс запущен или остановлен.

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

Входной таблица 2

Процесс таблицы устанавливается следующим образом:

  • ProcessId INT (первичный ключ)
  • ProcessName УАКСНАК (255)
  • ProcessOwner УАКСНАК (255)

Логически, действие начать процесс всегда должно сопровождаться действием СТОП, и отображение в парах, однако ошибки в данных означают, что не всегда СТОП действие для каждых С действий , В этих случаях нет ничего, что я могу сделать, но отображать NULL для отсутствующей записи СТОП

Желаемая выходной

Я хотел бы представлять данные в сетке со следующими заголовками.

  • ProcessOwner
  • ProcessName
  • ProcessStartTime
  • ProcessEndTime

Кто достиг чего-то, как это раньше?

Я не уверен, как начать решать вопрос, который мне нужен.

Пример данных

ProcessTimer стол

ProcessTimerId,ProcessTimerDatetime,ProcessTimerAction,ProcessId 
1,1/1/2017 08:00:34,START,883 
2,1/1/2017 08:03:76,STOP,883 
3,1/1/2017 08:03:77,START,445 
4,1/1/2017 08:03:79,START,636 
5,1/1/2017 08:05:77,STOP,445 
6,1/1/2017 08:07:34,START,445 
7,1/1/2017 08:09:23,START,445 
8,1/1/2017 08:12:61,STOP,636 
9,1/1/2017 08:14:65,STOP,445 

Процесс таблицы

ProcessId,ProcessName,ProcessOwner 
445,CTC hourlies,Sarah Parkes 
636,Garage import,John Dean 
883,DF task,Kate Duke 
+0

Вы говорите о получении запуска и остановки на одной строке? – Snowlockk

+0

Если так, то в строке Row_Number, разделенной на ProcessId. Присоединиться к нему с помощью RID = RID + 1 AND ProcessId = ProcessId – Snowlockk

ответ

1

Вот одна реализация:

WITH ProcessTimerWithRowNum([ProcessId], [ProcessTimerAction], [ProcessTimerDatetime],[rno]) 
AS 
(SELECT [ProcessId], 
     [ProcessTimerAction], 
     [ProcessTimerDatetime], 
     ROW_NUMBER() OVER(PARTITION BY ProcessId ORDER BY ProcessTimerId) AS [rno] 
    FROM ProcessTime) 

SELECT PT.[ProcessId], 
     P.[ProcessOwner], 
     P.[ProcessName], 
     PT.[ProcessTimerDatetime] AS StartTime, 
     DPT.ProcessTimerDatetime AS EndTime FROM 

ProcessTimerWithRowNum PT 

LEFT JOIN 

ProcessTimerWithRowNum DPT 

ON PT.ProcessId = DPT.ProcessId AND DPT.ProcessTimerAction = 'STOP' AND DPT.rno = PT.rno + 1 

INNER JOIN Process P ON PT.ProcessId = P.ProcessId 

WHERE PT.ProcessTimerAction = 'START' 

Выход для приведенных выше данных:

ProcessOwner | ProcessName | StartTime | EndTime 

445 |Sarah Parkes| CTC hourlies| 1/1/2017 08:03:77| 1/1/2017 08:05:77 

445 |Sarah Parkes| CTC hourlies| 1/1/2017 08:07:34| NULL 

445 |Sarah Parkes| CTC hourlies| 1/1/2017 08:09:23| 1/1/2017 08:14:65 

636 |John Dean| Garage import| 1/1/2017 08:03:79| 1/1/2017 08:12:61 

883 |Kate Duke| DF task| 1/1/2017 08:00:34| 1/1/2017 08:03:76 
+0

Единственное изменение, которое я должен был сделать, это «OVER (PARTITION by ProcessId ORDER BY ProcessTimerId) AS [rno]' to «OVER (PARTITION by ProcessId ORDER BY ProcessTimerDateTime) AS [rno] '. Я думаю, это происходит потому, что иногда время может входить в базу данных из последовательности. Звучит это правильно? В настоящее время у меня есть L-пластины с пониманием этого вопроса. –

+0

Звучит неплохо! Дайте мне знать, если вам нужны какие-либо разъяснения. – Shruti