Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查看当前行和下一行,确定一个阶段需要多长时间_Sql_Sql Server_Common Table Expression_Datediff - Fatal编程技术网

Sql 查看当前行和下一行,确定一个阶段需要多长时间

Sql 查看当前行和下一行,确定一个阶段需要多长时间,sql,sql-server,common-table-expression,datediff,Sql,Sql Server,Common Table Expression,Datediff,我正在为一个工作项目工作,数据记录类型系统。目前正在使用SQL Server 2008,如果需要,可以升级。目前我们正在对设备进行1分钟的间隔,我们正在收集各种信息,我只担心时间和步骤数 我正试图确定机器在离开前的某一步所花费的时间长度。我有一个方法,我正在使用,它目前的工作。然而,它需要很长时间才能运行。5个多小时 我当前设置了一个如下所示的视图 With Steps AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Time) AS RowNu

我正在为一个工作项目工作,数据记录类型系统。目前正在使用SQL Server 2008,如果需要,可以升级。目前我们正在对设备进行1分钟的间隔,我们正在收集各种信息,我只担心时间和步骤数

我正试图确定机器在离开前的某一步所花费的时间长度。我有一个方法,我正在使用,它目前的工作。然而,它需要很长时间才能运行。5个多小时

我当前设置了一个如下所示的视图

With Steps AS (SELECT        *, ROW_NUMBER() OVER (ORDER BY Time) AS RowNum 
FROM dbo.Data_All)

SELECT        Steps.Time, Steps.[Production Step]
FROM            Steps INNER JOIN
Steps AS Y ON Steps.RowNum = y.RowNum + 1 AND 
Steps.[Production Step] <> y.[Production Step]
然后,我运行一个基于该视图的查询,以获取我、步骤、时间、下一步时间和持续时间。这是一个需要很长时间的问题。所以我正在寻找一种更快的方法

With CTE AS (select Time, Row_Numbers=ROW_NUMBER() Over (Order by Time), 
[production step]  from Time_In_Step) 

  Select [Current Row].[Production Step], [current row].Time, 
[next row].Time AS [Next Step Time], Datediff(mi, [current row].Time,
[Next row].time) AS [Duration in Min]
  FROM CTE [Current Row]
  LEFT JOIN CTE [Next Row] ON 
  [Next Row].Row_Numbers = [Current Row].Row_Numbers + 1
这样做,我得到以下,这是我想要的。只是一种更快的方法

| Time            | Step #  | Next Step Time  | Duration in Min |
-----------------------------------------------------------------
| 7-25-2014 14:32 | 11      | 7-25-2014 15:32 | 60              |
| 7-25-2014 15:32 | 13      | 7-25-2014 15:40 | 8               |
| 7-25-2014 15:40 | 14      | 7-25-2014 15:42 | 2               |
| 7-25-2014 15:42 | 15      | 7-25-2014 15:50 | 8               |
| 7-25-2014 15:50 | 8       | Etc.....        | DateDiff        
有人知道如何优化这个吗?请让我知道,如果你需要任何更多的想法,我正在尝试做什么

我建议使用交叉应用:


按时编制索引将有助于提高绩效。

您可以尝试以下方法:

select c.production_step,
       c.time,
       case when f.time = c.time then null else f.time end as next_step_time,
       datediff(mi, c.time, f.time) as dur_in_mins
  from time_in_step c
 cross join time_in_step f
 where f.time = (select min(x.time) from time_in_step x where x.time > c.time)
    or (not exists (select 1 from time_in_step x where x.time > c.time)
   and f.time = c.time)

这是SQL中运行总问题的一个变体。你可以通过谷歌搜索这个短语获得其他资源。谢谢,我会仔细阅读,看看它是否能帮助我解决更多问题。谢谢你的快速回复。它似乎起作用了。只有一个问题,在子查询中,你是想用curr.time还是应该是c.time来匹配你上面所说的?无论哪种方式,它似乎都能工作,我感谢您的快速回复。@user2644176。我是说c。我最初输入了curr和next,然后意识到这些是保留字。太好了,它目前正在运行。我会看看它的效果如何。看到每个人都这么快地回答了这个问题,我觉得自己有点像个傻瓜。@user2644176 np,它可能没有戈登的查询那么快,但你能试试吗。在sql server 2012中,您可以更轻松地使用LAG函数来获取上一个时间值,但在sql server 08中则不行
select c.[Production Step], c.Time, 
       n.Time AS [n Step Time],
       Datediff(mi, c.Time, n.time) AS [Duration in Min]
from time_in_step c cross apply
     (select top 1 n.*
      from time_in_step n
      where c.time < n.time
     ) n;
select c.production_step,
       c.time,
       case when f.time = c.time then null else f.time end as next_step_time,
       datediff(mi, c.time, f.time) as dur_in_mins
  from time_in_step c
 cross join time_in_step f
 where f.time = (select min(x.time) from time_in_step x where x.time > c.time)
    or (not exists (select 1 from time_in_step x where x.time > c.time)
   and f.time = c.time)