我这里有一张表(如下所示),它有相位和运行时间。我想要完成的是 使用前一阶段之后的阶段时间作为前一阶段的结束时间。
所以现在我有:
rownum PhaseName PhaseID Time TimeEnd
1 Air Removal 2 2016-06-01 11:46:46.000 2016-06-01 11:46:46.000
2 Heat up 3 2016-06-01 11:56:47.000 2016-06-01 11:56:47.000
3 Steriliztion 4 2016-06-01 12:06:17.000 2016-06-01 12:06:17.000
4 Air Pressurization 5 2016-06-01 12:23:40.000 2016-06-01 12:23:40.000
5 Exhaust 6 2016-06-01 12:27:18.000 2016-06-01 12:27:18.000
6 Drying 7 2016-06-01 12:29:35.000 2016-06-01 12:29:35.000
7 Equalization 8 2016-06-01 12:34:36.000 2016-06-01 12:34:36.000
我想完成这个:
rownum PhaseName PhaseID Time TimeEnd
1 Air Removal 2 2016-06-01 11:46:46.000 2016-06-01 11:56:47.000
2 Heat up 3 2016-06-01 11:56:47.000 2016-06-01 12:06:17.000
3 Steriliztion 4 2016-06-01 12:06:17.000 2016-06-01 12:23:40.000
4 Air Pressurization 5 2016-06-01 12:23:40.000 2016-06-01 12:27:18.000
5 Exhaust 6 2016-06-01 12:27:18.000 2016-06-01 12:29:35.000
6 Drying 7 2016-06-01 12:29:35.000 2016-06-01 12:34:36.000
7 Equalization 8 2016-06-01 12:34:36.000 2016-06-01 12:34:36.000
- 没有结束时间的最后阶段......
原因是,我拥有在每个阶段捕获的数据,并且我正在尝试创建使用Phase作为Parent组的SSRS报告。但是我的数据随附了 阶段作为已嵌入捕获数据中的变量。我已经使用了很多CTE来达到我已经确定每个阶段发生的时间点,但现在需要弄清楚如何 达到上述结果。
答案 0 :(得分:0)
你似乎在最后的CTE中说 - 我们称之为CTE,你想做什么 ....来自CTE LEFT JOIN CTE2 ON CTE.rownum = CTE2.Rownum + 1
默认右下角值(将为null)使用COALESCE(CTE2.TimeEnd,CTE1.TimeEnd)
答案 1 :(得分:0)
我只在Oracle中使用过这些分析函数,但SQL Server有这些相同的函数,称为LAG和LEAD,其中LAG查看当前行之前的行,LEAD查看当前行之后的行。 / p>
以下是语法示例,其中函数查看过去行的TimeEnd,并根据PhaseID(或RowID将其设置为TimeStart,因为两者都是顺序的,并且行的顺序相同)。
SELECT LAG(TimeEnd, 1) OVER (ORDER BY PhaseID) TimeStart
以下是有关这些分析功能的更多信息: http://blog.sqlauthority.com/2011/11/15/sql-server-introduction-to-lead-and-lag-analytic-functions-introduced-in-sql-server-2012/
编辑:这些功能仅在SQL Server 2012及更高版本中,但我发现了一篇文章,介绍了如何使用CTE在早期版本的SQL Server中模仿这些功能,就像您一直在做的那样:http://www.databasejournal.com/features/mssql/lead-and-lag-functions-in-sql-server-2012.html