您可以使用LAG
让每一行的下一次(如果这样的话)。请注意,我们使用的是PARTITION BY
子句分组这里:
DECLARE @DataSource TABLE
(
[CITA] INT
,[FECHACITA] DATE
,[MANODEOBRA] VARCHAR(32)
,[UNIDTIEMPO] TIME
,[MECANICO] VARCHAR(64)
);
INSERT INTO @DataSource ([CITA], [FECHACITA], [MANODEOBRA], [UNIDTIEMPO], [MECANICO])
VALUES ('261354', '06/10/2017', 'M-M.O. 0 MANTENIMIENTO', '09:30', '10 LUIS ENRIQUE HERRERA MARTINEZ')
,('261354', '06/10/2017', 'M-M.O. 0 MANTENIMIENTO', '09:35', '10 LUIS ENRIQUE HERRERA MARTINEZ')
,('261354', '06/10/2017', 'M-M.O. 0 MANTENIMIENTO', '09:40', '10 LUIS ENRIQUE HERRERA MARTINEZ')
,('261354', '06/10/2017', 'M-M.O. 0 MANTENIMIENTO', '09:45', '10 LUIS ENRIQUE HERRERA MARTINEZ')
,('261354', '06/10/2017', 'M-M.O. 0 MANTENIMIENTO', '09:50', '10 LUIS ENRIQUE HERRERA MARTINEZ')
,('261354', '06/10/2017', 'M-M.O. 0 MANTENIMIENTO', '09:55', '10 LUIS ENRIQUE HERRERA MARTINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '08:30', '02 ERIK BENJAMIN GONZALEZ GODINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '08:35', '02 ERIK BENJAMIN GONZALEZ GODINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '08:40', '02 ERIK BENJAMIN GONZALEZ GODINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '08:45', '02 ERIK BENJAMIN GONZALEZ GODINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '08:50', '02 ERIK BENJAMIN GONZALEZ GODINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '08:55', '02 ERIK BENJAMIN GONZALEZ GODINEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '09:00', '04 JUAN CARLOS MONTAÑEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '09:05', '04 JUAN CARLOS MONTAÑEZ')
,('261858', '06/10/2017', 'M-M.O. 2 DIAGNOSTICO', '09:10', '04 JUAN CARLOS MONTAÑEZ');
SELECT [CITA], [FECHACITA], [MANODEOBRA], [MECANICO]
,DATEDIFF(MINUTE, [UNIDTIEMPO], LEAD([UNIDTIEMPO], 1, NULL) OVER (PARTITION BY [CITA], [FECHACITA], [MANODEOBRA], [MECANICO] ORDER BY [UNIDTIEMPO])) AS [TimeInMinutes]
FROM @DataSource
ORDER BY [FECHACITA]
,[UNIDTIEMPO];
我们使用DATEDIFF
函数获取分钟我们的时间差。有了这个结果,剩下的就是简单地总结次,每次组:
WITH DataSource AS
(
SELECT [CITA], [FECHACITA], [MANODEOBRA], [MECANICO]
,DATEDIFF(MINUTE, [UNIDTIEMPO], LEAD([UNIDTIEMPO], 1, NULL) OVER (PARTITION BY [CITA], [FECHACITA], [MANODEOBRA], [MECANICO] ORDER BY [UNIDTIEMPO])) AS [TimeInMinutes]
FROM @DataSource
)
SELECT [CITA], [FECHACITA], [MANODEOBRA], [MECANICO]
,CAST(CONCAT(SUM([TimeInMinutes])/60 , ':', SUM([TimeInMinutes]) % 60) AS TIME) AS UNIDTIEMPO
FROM DataSource
GROUP BY [CITA], [FECHACITA], [MANODEOBRA], [MECANICO];
注意,你不指定UNIDTIEMPO
列的SQL数据类型,所以我使用时间。如果您将其存储为字符串,则需要将其转换为time
。
为SQL Server 2008 R2
,您可以使用下面的查询:
WITH DataSource AS
(
SELECT [CITA], [FECHACITA], [MANODEOBRA], [UNIDTIEMPO], [MECANICO]
,ROW_NUMBER() OVER (PARTITION BY [CITA], [FECHACITA], [MANODEOBRA], [MECANICO] ORDER BY [UNIDTIEMPO]) AS [RowID]
FROM @DataSource
),
FinalDataSource AS
(
SELECT DS1.[CITA], DS1.[FECHACITA], DS1.[MANODEOBRA], DS1.[MECANICO]
,DATEDIFF(MINUTE, DS1.[UNIDTIEMPO], DS2.[UNIDTIEMPO]) AS [TimeInMinutes]
FROM DataSource DS1
INNER JOIN DataSource DS2
ON DS1.[CITA] = DS2.[CITA]
AND DS1.[FECHACITA] = DS2.[FECHACITA]
AND DS1.[MANODEOBRA] = DS2.[MANODEOBRA]
AND DS1.[MECANICO] = DS2.[MECANICO]
AND DS1.[RowID] = DS2.[RowID] - 1
)
SELECT [CITA], [FECHACITA], [MANODEOBRA], [MECANICO]
,CAST(CAST(SUM([TimeInMinutes])/60 AS VARCHAR(8)) + ':' + CAST(SUM([TimeInMinutes]) % 60 AS VARCHAR(8)) AS TIME) AS UNIDTIEMPO
FROM FinalDataSource
GROUP BY [CITA], [FECHACITA], [MANODEOBRA], [MECANICO];
提示:你想用'GROUP BY',你想找到'MIN'和'MAX'之间的'DATEDIFF' UNIDTIEMPO的。 – ZLK
欢迎来到SO!请告诉我们您已经尝试解决问题,请参阅[mcve]。发布一些你已经尝试过的SQL,这将帮助我们更好地理解你的问题。 – pcdev