第一次发帖。请客气。
具有带有“ 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,依此类推,等等。
答案 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]
再次感谢大家! 我相信您很快就会再收到我的来信...