我想将当前行与下一行中的值进行比较。 SQL 有 LEAD
和 LAG
函数来获取下一个和上一个值,但我无法使用它们,因为我使用的是 SQL Server 2008。
那么我怎样才能得到这个呢?
我有带有输出的表格
+----+-------+-----------+-------------------------+
| Id | ActId | StatusId | MinStartTime |
+----+-------+-----------+-------------------------+
| 1 | 42 | 1 | 2014-02-14 11:17:21.203 |
| 2 | 42 | 1 | 2014-02-14 11:50:19.367 |
| 3 | 42 | 1 | 2014-02-14 11:50:19.380 |
| 4 | 42 | 6 | 2014-02-17 05:25:57.280 |
| 5 | 42 | 6 | 2014-02-19 06:09:33.150 |
| 6 | 42 | 1 | 2014-02-19 06:11:24.393 |
| 7 | 42 | 6 | 2014-02-19 06:11:24.410 |
| 8 | 42 | 8 | 2014-02-19 06:44:47.070 |
+----+-------+-----------+-------------------------+
我想要做的是,如果当前行状态为 1,下一行状态为 6,并且两次时间相同(最多分钟),那么我想要获取状态为 1 的行。
例如:Id 6 行的状态为 1,Id 7 行的状态为 6,但两次时间相同,即。 2014-02-19 06:11
所以我想获取状态1的行或id,即。编号 6
最佳答案
在您的情况下,id
似乎是数字,您可以只进行自连接:
select t.*
from table t join
table tnext
on t.id = tnext.id - 1 and
t.StatusId = 1 and
tnext.StatusId = 6 and
datediff(second, t.MinStartTime, tnext.MinStartTime) < 60;
这不是同一分钟。时间在 60 秒之内。您实际上需要相同的日历时间分钟吗?如果是这样,您可以这样做:
select t.*
from table t join
table tnext
on t.id = tnext.id - 1 and
t.StatusId = 1 and
tnext.StatusId = 6 and
datediff(second, t.MinStartTime, tnext.MinStartTime) < 60 and
datepart(minute, t.MinStartTime) = datepart(minute, tnext.MinStartTime);
关于sql - SQL Server 2008 中超前滞后函数的替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22188514/