尝试求和事件之间的总时间,其中需要从下一次减去当前时间戳

时间:2019-04-17 15:20:45

标签: sql sql-server tsql

第一次发帖。请客气。

具有带有“ ID”,“ State”和“ TimeStamp”的数据库表。 “状态”数字代表我工厂中机器的当前状态。即100 =已停止,130 =正在运行,170 =故障等,等等。 每次状态编号更改时,都会插入一条新记录。 这样效果很好,并为我提供了带有州号和相关时间戳的条目。 通过从下一条记录的时间戳(状态更改时)减去给定记录的时间戳,可以找到计算机处于特定状态的持续时间。

到目前为止,我已经使用LEAD函数获取下一行的时间戳并将其放在前一行的旁边。在视觉上,这看起来像一个开始:如果我减去两个时间戳列,我会得到一个时差。如果存在差异,我可以为每个不同州号的每个实例求和。

SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        [t_stamp],
        LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime 
FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
WHERE [t_stamp] BETWEEN '2019-04-17 13:00' AND '2019-04-17 14:00'

我最终想要的是一个显示饼图的报告。饼图的每个部分将代表机器在每种给定状态下的累积时间。例如在状态130中持续5hr43min,在状态170中持续56min,依此类推,等等。

3 个答案:

答案 0 :(得分:1)

您已经完成了所有艰辛的工作,现在可以使用子查询和DATEDIFF来获取所需的内容:

SELECT  [tbl_tg_machinestate_ndx],
        [Machine_State], DATEDIFF(mi,[t_stamp],NextStateTime) TimeInState
FROM 
(
  SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        [t_stamp],
        LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime 
  FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
  WHERE [t_stamp] BETWEEN '2019-04-17 13:00' AND '2019-04-17 14:00'
) SQ

答案 1 :(得分:0)

并汇总每种计算机状态的累积时间:

with a as (
    SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        HowLong = datediff(
            minute,
            [t_stamp],
            LEAD([t_stamp]) OVER (
                ORDER BY
                    [tbl_tg_machinestate_ndx] 
            )
        )
    FROM
        [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
    WHERE
        [t_stamp] BETWEEN '2019-04-17 13:00'
        AND '2019-04-17 14:00'
)
select
    Machine_State,
    CumulativeTime = sum(HowLong)
from
    a
group by
    Machine_State

答案 2 :(得分:0)

首先,感谢大家的快速响应。真的很有帮助! 只是作为背景,我不是SQL专家(可能只是一个新手),因此非常感谢您的帮助。

克里斯提供的代码可以很好地获取每一行的总时间。

使用Michael的代码,在LEAD函数之后的ORDER BY子句的末尾,我遇到了一个小问题。

然后我将这两个代码示例结合起来并使其起作用。

--my version...
  WITH StateTimes AS
  (
    SELECT
        [tbl_tg_machinestate_ndx],
        [Machine_State],
        DATEDIFF(second, [t_stamp], NextStateTime) AS TimeInState
    FROM
      (
      SELECT
            [tbl_tg_machinestate_ndx],
            [Machine_State],
            [t_stamp],
            LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]) NextStateTime
      FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
      WHERE [t_stamp] BETWEEN '2019-04-17 13:00' AND '2019-04-17 14:00'
      ) SQ --"SQ" denotes the sub-query (in the brackets)
  )
  SELECT
    [Machine_State],
    CumulativeTime = SUM(TimeInState)
  FROM
    StateTimes
  GROUP BY
    [Machine_State]

再次感谢大家! 我相信您很快就会再收到我的来信...