sql - SQL Server 2008 中超前滞后函数的替代

标签 sql sql-server sql-server-2008

我想将当前行与下一行中的值进行比较。 SQL 有 LEADLAG 函数来获取下一个和上一个值,但我无法使用它们,因为我使用的是 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/

相关文章:

mysql - 如何将文件 .mdf 和 .ldf 转换为 mysql 格式

sql - 创建新表或在现有表中添加列哪个更好

带有参数的sqlplus假脱机文件

sql-server - 用于 SQL Server 架构

sql - 带有条件结果的存储过程

c# - 如何在sql server表中存储zip文件

c# - 在 SQL Server Management Studio 中创建一个新的菜单项

php - WHERE查询上的PHP错误代码

sql - 如何减慢 SQL 查询速度?

SQL:除了查询