SQL Server 2012 - 根据行与行比较更新列

标签 sql sql-server compare sql-server-2012 rows

我有一个包含日期和时间的表。例如,列有 DateExTimeNewTimeStatus。我根据 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 fiddle demo

关于SQL Server 2012 - 根据行与行比较更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19304122/

相关文章:

SQL - 通过两个新列返回列中值的所有可能组合

mysql - oracle sql 列定义不明确错误

SQL——两个结果相除

sql-server - 在 VBA 中将记录集存储到数组

sql - 使用 R、ODBC 和 DBI 超出范围的数值

sql - MySQL - 我可以组合这 2 个 SQL 语句吗?合并 JOIN 和 AVG?

sql-server - MS-SQL 中的“START WITH”等效表达式

python - 比较两个文本文件并将匹配项转到新文件

java - 将 ArrayList 的 ArrayList 与 ArrayList 进行比较

r - 在 R 中的两个数据框中按组比较日期