SQL Server 查找机器开启期间的最长持续时间

sr4lhrrt  于 2023-01-12  发布在  其他
关注(0)|答案(4)|浏览(114)

我在SQL Server中有以下。我想查找计算机运行的最长持续时间。
| 行|日期时间|机器开启|
| - ------|- ------|- ------|
| 1个|2022年9月22日8时20分|1个|
| 第二章|2022年9月22日9时10分|无|
| 三个|2022年9月22日10时40分|1个|
| 四个|2022年9月22日10时52分|无|
| 五个|2022年9月22日12时30分|1个|
| 六个|2022年9月22日14时30分|无|
| 七|2022年9月22日15时|1个|
| 八个|2022年9月22日15时40分|无|
| 九|2022年9月22日16时25分|1个|
| 十个|2022年9月22日16时55分|无|
在上面的示例中,使用第5行和第6行,计算机处于ON状态的最长持续时间为2小时。在给定的时间范围内,可以提供最长持续时间的最佳SQL语句是什么?

    • 预期结果:**

60分钟
我已经研究了SQL中的LAG函数和LEAD函数。

ddrv8njm

ddrv8njm1#

如果这真的是您的数据,您可以简单地使用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];
0ejtzxu1

0ejtzxu12#

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

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

ubof19bj

ubof19bj3#

下面是另一种使用传统差距和孤岛方法的方法:

WITH src AS
(
  SELECT Island, mint = MIN([Timestamp]), maxt = MAX([Timestamp])
  FROM
  (
    SELECT [Timestamp], Island = 
      ROW_NUMBER() OVER (ORDER BY [Timestamp]) -
      ROW_NUMBER() OVER (PARTITION BY Running ORDER BY [Timestamp])
    FROM dbo.Machine_Status
  ) AS x GROUP BY Island
)
SELECT TOP (1) delta = 
   (DATEDIFF(second, mint, LEAD(mint,1) OVER (ORDER BY island)))
 FROM src ORDER BY delta DESC;
n6lpvg4x

n6lpvg4x4#

这是一个经典的差距和岛屿有点扭曲Adj

    • 示例**
Select Top 1
       Row1 = min(row)
      ,Row2 = max(row)+1
      ,TS1  = min(TimeStamp)
      ,TS2  = dateadd(SECOND,max(Adj),max(TimeStamp))
      ,Dur = datediff(Second,min(TimeStamp),max(TimeStamp)) + max(Adj)
 From (
        Select * 
              ,Grp = row_number() over( partition by Running order by TimeStamp) - row_number() over (order by timeStamp)
              ,Adj  = case when Running=1 and lead(Running,1) over (order by timestamp) = 0  then datediff(second,TimeStamp,lead(TimeStamp,1) over (order by TimeStamp) ) else 0 end
         From Machine_Status
      ) A
 Where Running=1
 Group By Grp
 Order By Dur Desc
    • 结果**
Row1    Row2    TS1                     TS2                       Dur
8       12      2023-01-10 08:25:30.000 2023-01-10 08:28:55.000   205

相关问题