2017-10-06 94 views
0

下午好我正试图在sql中生成一个查询,以了解每个服务订单使用的时间跨度。 任何帮助表示赞赏。T-SQL脚本来计算多行之间的经过时间

例如:

CITA FECHACITA MANODEOBRA UNIDTIEMPO MECANICO 
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 

所以应该被看作

CITA FECHACITA MANODEOBRA UNIDTIEMPO MECANICO 
261354 06/10/2017 M-M.O. 0 MANTENIMIENTO 00:25 10 LUIS ENRIQUE HERRERA 
MARTINEZ 
261858 06/10/2017 M-M.O. 2 DIAGNOSTICO 00:25 02 ERIK BENJAMIN 
GONZALEZ GODINEZ 
261858 06/10/2017 M-M.O. 2 DIAGNOSTICO 00:10 04 JUAN CARLOS MONTAÑEZ 
+0

提示:你想用'GROUP BY',你想找到'MIN'和'MAX'之间的'DATEDIFF' UNIDTIEMPO的。 – ZLK

+0

欢迎来到SO!请告诉我们您已经尝试解决问题,请参阅[mcve]。发布一些你已经尝试过的SQL,这将帮助我们更好地理解你的问题。 – pcdev

回答

0

您可以使用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]; 

enter image description here

我们使用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]; 

enter image description here

注意,你不指定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];