2016-07-21 4 views
-1

Я хотел бы получить следующий результат на изображении. Свертывание непрерывных диапазонов в отдельные строки в MSSQL. Пример кода ниже, я почти получил его, чтобы работать, хотя я думаю, что это довольно новобранец. Я думаю, что я должен использовать лидерство/отставание и разбиение, но не уверен, как заставить его работать.MSSQL TSQL Challenging Continuous Timeline Grouping

Пример Результат

Example Result

Пример таблицы данных ....

DROP Table #t2 
SELECT 
    [Duration (hours)] 
    ,CAST(LTRIM(RTRIM([Event Start])) AS DATETIME) AS [Start_Date] 
    ,CAST(LTRIM(RTRIM([Event Finsh])) AS DATETIME) AS [End_Date] 
    ,[Date of Record] 
    ,[Equipment] AS EQ 
    ,[Down Category] 
    ,[Failure Mode] AS FM 
    ,[Equipment] + ' - ' + [Failure Mode] AS id 

    INTO #t2 
FROM 
(
    SELECT 19.92472222 AS [Duration (hours)], '17-Jul-2016 10:04:31' AS [Event Start],'18-Jul-2016 06:00:00' AS [Event Finsh],'2016-07-17 ' AS [Date of Record],'CART43 ' AS [Equipment],'Breakdown ' AS [Down Category],'NO LABOUR ' AS [Failure Mode] 
    UNION ALL SELECT 12, '18-Jul-2016 06:00:00 ','18-Jul-2016 18:00:00 ','2016-07-18 ','CART43 ','Breakdown ','NO LABOUR ' 
    UNION ALL SELECT 12, '18-Jul-2016 18:00:00 ','19-Jul-2016 06:00:00 ','2016-07-18 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 12, '19-Jul-2016 06:00:00 ','19-Jul-2016 18:00:00 ','2016-07-19 ','CART43 ','Breakdown ','NO LABOUR ' 
    UNION ALL SELECT 12, '19-Jul-2016 18:00:00 ','20-Jul-2016 06:00:00 ','2016-07-19 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 24, '20-Jul-2016 06:00:00 ','21-Jul-2016 06:00:00 ','2016-07-20 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 0.200277778, '21-Jul-2016 06:00:00 ','21-Jul-2016 06:12:01 ','2016-07-21 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 18.70138889, '18-Jul-2016 11:17:55 ','19-Jul-2016 06:00:00 ','2016-07-18 ','CART1 ','Planned Down ','SCHEDULED DOWN ' 
    UNION ALL SELECT 1.305277778, '19-Jul-2016 06:00:00 ','19-Jul-2016 07:18:19 ','2016-07-19 ','CART1 ','Planned Down ','SCHEDULED DOWN ' 
    UNION ALL SELECT 4.195, '19-Jul-2016 07:18:19 ','19-Jul-2016 11:30:01 ','2016-07-19 ','CART1 ','Breakdown Other ','SCHEDULED DOWN OVERRUN ' 
    UNION ALL SELECT 0.200555556, '20-Jul-2016 11:53:12 ','20-Jul-2016 12:05:14 ','2016-07-20 ','CART1 ','Breakdown ','WHEEL ' 
    UNION ALL SELECT 2.542777778, '20-Jul-2016 12:21:15 ','20-Jul-2016 14:53:49 ','2016-07-20 ','CART1 ','Breakdown ','CONTROL ' 
    UNION ALL SELECT 3.985, '20-Jul-2016 18:43:49 ','20-Jul-2016 22:42:55 ','2016-07-20 ','CART1 ','Breakdown ','HYDRAULICS ' 
    UNION ALL SELECT 4.694722222, '21-Jul-2016 01:18:19 ','21-Jul-2016 06:00:00 ','2016-07-20 ','CART1 ','Breakdown ','MEASURE ' 
    UNION ALL SELECT 0.200277778, '21-Jul-2016 06:00:00 ','21-Jul-2016 06:12:01 ','2016-07-21 ','CART1 ','Breakdown ','MEASURE ' 
) TB 


SELECT [Eq], [FM], MIN([Start_Date]) AS [Event Start], MAX(EF2) AS [Event Finish] 
FROM 
(
    SELECT [T1].[Eq] 
    , [T1].[FM] 
    , [T1].[Start_Date] 
    , [T1].[End_Date] 
    , ISNULL([T2].[End_Date],[T1].[End_Date]) AS [EF2] 
    FROM #t2 [T1] 
    LEFT JOIN #t2 [T2] ON 
      [T1].[Eq]=[T2].[Eq] 
     AND [T1].[FM] = [T2].[FM] 
     AND [T1].[End_Date]=[T2].[Start_Date] 
) AS TB 
GROUP BY [Eq], [FM], [EF2] 
ORDER BY [Eq], MIN([Start_Date]) 
+1

Похоже, что [Интервалы упаковки] (http://blogs.solidq.com/en/sqlserver/packing-intervals/) для меня. –

ответ

0

Попробуйте

DROP Table #t2 
SELECT 
    [Duration (hours)] 
    ,CAST(LTRIM(RTRIM([Event Start])) AS DATETIME) AS [Start_Date] 
    ,CAST(LTRIM(RTRIM([Event Finsh])) AS DATETIME) AS [End_Date] 
    ,[Date of Record] 
    ,[Equipment] AS EQ 
    ,[Down Category] 
    ,[Failure Mode] AS FM 
    ,[Equipment] + ' - ' + [Failure Mode] AS id 

    INTO #t2 
FROM 
(
    SELECT 19.92472222 AS [Duration (hours)], '17-Jul-2016 10:04:31' AS [Event Start],'18-Jul-2016 06:00:00' AS [Event Finsh],'2016-07-17 ' AS [Date of Record],'CART43 ' AS [Equipment],'Breakdown ' AS [Down Category],'NO LABOUR ' AS [Failure Mode] 
    UNION ALL SELECT 12, '18-Jul-2016 06:00:00 ','18-Jul-2016 18:00:00 ','2016-07-18 ','CART43 ','Breakdown ','NO LABOUR ' 
    UNION ALL SELECT 12, '18-Jul-2016 18:00:00 ','19-Jul-2016 06:00:00 ','2016-07-18 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 12, '19-Jul-2016 06:00:00 ','19-Jul-2016 18:00:00 ','2016-07-19 ','CART43 ','Breakdown ','NO LABOUR ' 
    UNION ALL SELECT 12, '19-Jul-2016 18:00:00 ','20-Jul-2016 06:00:00 ','2016-07-19 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 24, '20-Jul-2016 06:00:00 ','21-Jul-2016 06:00:00 ','2016-07-20 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 0.200277778, '21-Jul-2016 06:00:00 ','21-Jul-2016 06:12:01 ','2016-07-21 ','CART43 ','Breakdown ','NO PARTS AVAILABLE ' 
    UNION ALL SELECT 18.70138889, '18-Jul-2016 11:17:55 ','19-Jul-2016 06:00:00 ','2016-07-18 ','CART1 ','Planned Down ','SCHEDULED DOWN ' 
    UNION ALL SELECT 1.305277778, '19-Jul-2016 06:00:00 ','19-Jul-2016 07:18:19 ','2016-07-19 ','CART1 ','Planned Down ','SCHEDULED DOWN ' 
    UNION ALL SELECT 4.195, '19-Jul-2016 07:18:19 ','19-Jul-2016 11:30:01 ','2016-07-19 ','CART1 ','Breakdown Other ','SCHEDULED DOWN OVERRUN ' 
    UNION ALL SELECT 0.200555556, '20-Jul-2016 11:53:12 ','20-Jul-2016 12:05:14 ','2016-07-20 ','CART1 ','Breakdown ','WHEEL ' 
    UNION ALL SELECT 2.542777778, '20-Jul-2016 12:21:15 ','20-Jul-2016 14:53:49 ','2016-07-20 ','CART1 ','Breakdown ','CONTROL ' 
    UNION ALL SELECT 3.985, '20-Jul-2016 18:43:49 ','20-Jul-2016 22:42:55 ','2016-07-20 ','CART1 ','Breakdown ','HYDRAULICS ' 
    UNION ALL SELECT 4.694722222, '21-Jul-2016 01:18:19 ','21-Jul-2016 06:00:00 ','2016-07-20 ','CART1 ','Breakdown ','MEASURE ' 
    UNION ALL SELECT 0.200277778, '21-Jul-2016 06:00:00 ','21-Jul-2016 06:12:01 ','2016-07-21 ','CART1 ','Breakdown ','MEASURE '   
) TB  

DROP Table #TempTable 

SELECT 
    *, 
    ROW_NUMBER() OVER (ORDER BY Start_Date) AS RowId  
INTO #TempTable 
FROM 
    #t2 


DROP Table #Result 
SELECT 
    FM, 
    SUM(R.[Duration (hours)]) AS [Duration (hours)], 
    MAX(R.End_Date) AS End_Date, 
    MIN(R.RowId) AS RowId 
INTO #Result 
FROM 
(
    SELECT 
     A.[Duration (hours)] , 
     A.Start_Date , 
     A.End_Date , 
     A.[Date of Record] , 
     A.EQ , 
     A.[Down Category] , 
     A.FM , 
     A.id , 
     A.RowId, 
     CASE WHEN A.FM = B.FM OR A.FM = C.FM THEN -1 ELSE A.RowId END ISContinue   
    FROM 
     #TempTable A LEFT JOIN 
     (SELECT (RowId + 1) AS RowId, FM FROM #TempTable) B ON A.RowId = B.RowId LEFT JOIN 
     (SELECT (RowId -1) AS RowId, FM FROM #TempTable) C ON A.RowId = C.RowId 
) R 
GROUP BY 
    R.FM, 
    R.ISContinue  


SELECT 
    R.[Duration (hours)], 
    T.Start_Date , 
    R.End_Date , 
    T.[Date of Record] , 
    T.EQ , 
    T.[Down Category] , 
    T.FM , 
    T.id 
FROM 
    #Result R INNER JOIN   
    #TempTable T ON R.RowId = T.RowId 
ORDER BY 
    T.Start_Date 

ВЫВОД

enter image description here

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

  • Нет связанных вопросов^_^