【问题标题】:Find the longest duration during the machine is ON查找机器开启期间的最长持续时间
【发布时间】:2023-01-10 15:43:48
【问题描述】:

我在 SQL Server 中有下表。我想找到机器运行的最长持续时间。

在上面的例子中,机器开启的最长持续时间是 2 小时,使用第 5 行和第 6 行。在给定时间范围内,可以提供最长持续时间的最佳 SQL 语句是什么?

我研究了 SQL 中的 LAG 函数和 LEAD 函数。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

如果这真的是你的数据,你可以简单地使用INNER JOINDATEDIFF

SELECT MAX(DATEDIFF(MINUTE, T1.[DateTime], T2.[DateTime]))
FROM [my_table] T1
INNER JOIN [my_table] T2
    ON T1.[Row] + 1 = T2.[Row];

【讨论】:

  • 这还将考虑 machineon = 0 的行与 machineon = 1 的下一行之间的日期差异,这似乎是不正确的。据我了解这个问题,只有 machineon = 1 的行和下一行必须被考虑。添加 WHERE t1.machineon = 1 应该可以解决这个问题。
  • @JonasMetzler 是的,为了确保您使用的是正确的行,您添加WHERE t1.machineon = 1 甚至t2.machineone = 0,但数据似乎已经排序和验证。
【解决方案2】:

这是一个间隙和孤岛问题,解决它的一种选择是使用运行总和,每当 machine_on = 0 时该总和增加 1,这将为连续的 1 后跟 0 定义唯一的组。

select top 1 datediff(minute, min([datetime]), max([datetime])) duration
from
(
  select *, 
   sum(case when machine_on = 0 then 1 else 0 end) over (order by datetime desc) grp
  from table_name
) T
group by grp
order by datediff(minute, min([datetime]), max([datetime])) desc

See demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2021-10-04
    相关资源
    最近更新 更多