2015-08-20 3 views
1

У меня очень необычный запрос. У меня есть отфильтрованные данные в таблице, а столбцы - ID, Date и Event. Событие представляет собой столбец XML, в котором в одном из тегов находятся StartWork и EndWork. Из огромных данных я отфильтровал данные для запроса. Мои данные Sample имеют 6 строк, в последовательности StartWork, EndWork, StartWork, EndWork и т. Д. Что именно я хочу сделать, это найти разницу во времени между каждой комбинацией. Я имею в виду, EndWork - StartWork = Разница. Следующий EndWork - StartWork = Difference2 и т. Д.преобразовать строки sql в столбец

enter image description here

В основном я хочу, 2-1, 4-3, 6-5 и так далее. Я пытался сделать это с Pivot, но не смог получить желаемый результат

ответ

2
Select DateDiff(minute,StartWork.datacreated,EndWork.datacreated) 
from 
(Select datacreated,LineNb=row_number() over(Order by datacreated) from Table where eventdata.value('(/data/status/text())[1]','varchar(15)')='StartWork') StartWork 
INNER JOIN 
(Select datacreated,LineNb=row_number() over(Order by datacreated) from Table where eventdata.value('(/data/status/text())[1]','varchar(15)')='EndWork') EndWork 
ON StartWork.LineNb=EndWork.LineNb 
+0

Спасибо hercule. это решение работает .. – anshul

1

Это должно помочь вам:

declare @xmlStart XML='<data><status>StartWork</status></data>'; 
declare @xmlENd XML='<data><status>EndWork</status></data>'; 

declare @tbl TABLE(id INT,datecreated DATETIME,eventdata XML); 
INSERT INTO @tbl VALUES(1,{ts'2015-07-29 09:17:34'},@xmlStart) 
         ,(2,{ts'2015-07-29 09:20:24'},@xmlEnd) 
         ,(3,{ts'2015-07-29 10:05:41'},@xmlStart) 
         ,(4,{ts'2015-07-29 10:18:34'},@xmlEnd); 

WITH resolvedCTE AS 
(
    SELECT TOP 100 PERCENT id,datecreated,eventdata.value('(/data/status)[1]','varchar(max)') AS EventStatus FROM @tbl 
) 
,StartEvnets AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY datecreated) AS inx,id,datecreated FROM resolvedCTE WHERE EventStatus='StartWork' 
) 
,EndEvnets AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY datecreated) AS inx,id,datecreated FROM resolvedCTE WHERE EventStatus='EndWork' 
)SELECT StartEvnets.id, CAST(EndEvnets.datecreated - StartEvnets .datecreated AS TIME) 
FROM StartEvnets 
INNER JOIN EndEvnets ON StartEvnets.inx =EndEvnets.inx 
+0

SQL 2008. не 2012. – anshul

+0

ОК, я буду играть на скрипке что-то из ... – Shnugo

+0

решение по @hercule является по той же логике, это просто немного проще. он не использует CTE. – anshul

0

Пусть «ТПС» Ваше имя таблицы. Здесь вы идете:

SELECT t.datecreated - t2.datecreated 
FROM tbl t, tbl t2 
WHERE t.id IN 
    (SELECT id FROM tbl WHERE _eventdata LIKE ('%EndWork%')) 
    AND t2.id = t.id -1 

Пожалуйста, отмечайте это как ответ, если он работает ...

Смежные вопросы