我有一个包含日期和时间的表。例如,列有 Date
、ExTime
、NewTime
、Status
。我根据 expkey
列对它们进行排序,这使得它们以正确的顺序显示。
我想要进行逐行比较,并将 extime
的第二行列与第一行列 NewTime
进行比较。如果 extime < Newtime 那么我想用“1”更新 status
。然后逐行遍历表,其中上例中的第二行成为第一行,并拉出并使用新的第二行。这是我现在拥有的示例 - 但由于某种原因它没有击中并运行所有行。
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 行。
任何帮助弄清楚为什么这种方法有效但并非全部有效的帮助将不胜感激。
广告。
最佳答案
在 SQL Server 2012 上,您可以使用窗口函数 lag()
轻松更新状态
:
with cte as (
select
extime,
lag(newtime) over(partition by id, date order by expKey) as newtime,
status
from table1
)
update cte set status = 1 where extime < newtime;
关于SQL Server 2012 - 根据行与行比较更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19304122/