2

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

我想进行逐行比较并将第二行列extime与第一行列进行比较NewTime。如果 extime < Newtime 那么我想status用“1”更新。然后逐行遍历表,上面示例中的第二行成为第一行,新的第二行被拉取并使用。这是我现在拥有的示例-但由于某种原因,它并没有击中并工作所有行。

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

这并没有像我想要的那样击中所有行。我有比较字段 ID 和日期的 where 子句,以确保这些行附加到同一个人。如果 ID 或日期不同,则它不会附加到同一个人,所以我不想更新状态。所以基本上如果第 2 行的 ID = 第 1 行的 ID 和第 2 行的日期 = 第 1 行的日期我想比较第 2 行的 extime 并查看它是否小于第 1 行的 newtime - 如果是,则更新状态字段第 2 行。

任何帮助弄清楚为什么这种工作但不是全部都将不胜感激。

广告。

4

2 回答 2

4

status在 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 fiddle demo

于 2013-10-11T19:55:04.453 回答
0

我没有对此进行测试,但我已经处理了比较相邻行的类似问题。我把它放在一起,所以它可能需要调整,但试一试。

;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
于 2013-10-10T20:55:57.037 回答