/ / MSSQL TSQL Wymagające ciągłe grupowanie osi czasu - sql-server, tsql, analytics, partycjonowanie, oś czasu

MSSQL TSQL Wymagające ciągłe grupowanie osi czasu - sql-server, tsql, analityka, partycjonowanie, oś czasu

Chciałbym osiągnąć następujący wynik wObraz. Zwijanie ciągłych zakresów w pojedyncze wiersze w MSSQL. Przykładowy kod poniżej, prawie dostałem go do pracy, chociaż myślę, że jest całkiem nowicjuszem. Myślę, że mam używać lead / lag i partycjonowanie, ale nie wiem, jak to zrobić.

Przykład Wynik

Przykład Wynik

Przykładowe dane tabeli ....

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])

Odpowiedzi:

0 dla odpowiedzi № 1

Spróbuj tego

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

WYDAJNOŚĆ

wprowadź opis obrazu tutaj