SQL Server 2012-基于行到行比较更新列

SQL Server 2012-基于行到行比较更新列,sql,sql-server,compare,sql-server-2012,rows,Sql,Sql Server,Compare,Sql Server 2012,Rows,我有一个包含日期和时间的表。例如,列包括日期、ExTime、NewTime和Status。我是根据expkey列对它们进行排序的,该列使它们以正确的顺序显示 我想逐行比较,并将extime的第二行列与第一行列NewTime进行比较。如果extime

我有一个包含日期和时间的表。例如,列包括日期、ExTime、NewTime和Status。我是根据expkey列对它们进行排序的,该列使它们以正确的顺序显示

我想逐行比较,并将extime的第二行列与第一行列NewTime进行比较。如果extime
UPDATE t
SET t.Status = 1
FROM MyTable t
CROSS APPLY (SELECT TOP 1 NewTime
             FROM MyTable
             WHERE ID = t.ID AND [Date] = t.[Date]
             ORDER BY ExpKey) t1
WHERE t.Extime < t1.NewTime
这并不像我希望的那样击中所有的行。我使用where子句比较字段ID和日期,以确保行附加到同一个人。如果ID或日期不相同,则不会附加到同一个人,因此我不想更新状态。所以基本上,如果第2行的ID=第1行的ID,第2行的日期=第1行的日期,我想比较第2行的extime,看看它是否小于第1行的newtime-如果是,那么更新第2行的status字段

如果有人能帮我弄清楚为什么这类方法有效,但并非所有方法都有效,我们将不胜感激


Ad.

我没有测试过这个,但我已经处理过比较相邻行的类似问题。我即兴将其组合在一起,因此可能需要调整,但请尝试一下

;WITH CTE AS
(   SELECT ID,[Date],ExpKey,ExTime,NewTime,
    ROW_NUMBER()OVER(PARTITION BY ID,[Date] ORDER BY ExpKey) AS Sort
    FROM MyTable
)
UPDATE row2
SET row2.[Status] = 2
WHERE row2.ExTime < row1.NewTime
FROM CTE row2
CROSS JOIN CTE row1
    ON row1.ID = row2.ID
    AND row1.[Date] = row2.[Date]
    AND row1.Sort = row2.Sort-1 --Join to prior row

我还没有对此进行测试,但我已经处理过比较相邻行的类似问题。我即兴将其组合在一起,因此可能需要调整,但请尝试一下

;WITH CTE AS
(   SELECT ID,[Date],ExpKey,ExTime,NewTime,
    ROW_NUMBER()OVER(PARTITION BY ID,[Date] ORDER BY ExpKey) AS Sort
    FROM MyTable
)
UPDATE row2
SET row2.[Status] = 2
WHERE row2.ExTime < row1.NewTime
FROM CTE row2
CROSS JOIN CTE row1
    ON row1.ID = row2.ID
    AND row1.[Date] = row2.[Date]
    AND row1.Sort = row2.Sort-1 --Join to prior row

在SQL Server 2012上,您可以使用窗口功能轻松更新状态:


在SQL Server 2012上,您可以使用窗口功能轻松更新状态:


我认为在纯SQL中无法做到这一点。您将需要某种程序来完成此操作。@Andrew如果我理解正确的话,在SQL 2012中使用lag函数或SQL server 2008中使用apply或row_number的更笨拙的解决方案时,这是可能的。我不认为您可以在纯SQL中完成此操作。您将需要某种程序来完成此操作。@Andrew如果我理解正确的话,在SQL 2012中使用lag函数或SQL server 2008中使用apply或row_number的更笨拙的解决方案时,这是可能的