1

我正在寻找一种方法来更新前一天发生过其他事件的所有行。

例子:

ID     Config Number     Date          Status
1      238               10/9/2013     1
2      351               1/9/2013      2
3      351               2/9/2013      0
4      238               11/9/2013     0
5      124               18/9/2013     3
6      238               20/9/2013     0
7      238               12/9/2013     0
8      124               20/9/2013     0
9      238               13/9/2013     0

更新后我想有类似的东西:

ID     Config Number     Date          Status
1      238               10/9/2013     1
2      351               1/9/2013      2
3      351               2/9/2013      2
4      238               11/9/2013     1
5      124               18/9/2013     3
6      238               20/9/2013     0
7      238               12/9/2013     1 
8      124               20/9/2013     0
9      238               13/9/2013     1

我现在拥有的是:

Update sc
set sc.Status = (Select Status From sc1 inner Join sc On sc.Id = sc1.ID)
From sc

而且我知道它不起作用,但我不知道我的查询应该是什么样子。

4

2 回答 2

1
update T1 set
    Status = T2.[Status]
from sc as T1
    inner join sc as T2 on T2.[Date] = dateadd(dd, -1, T1.Date)

sql fiddle demo

的,如果你必须在里面搜索上一个日期Config Number

update T1 set
    Status = T2.[Status]
from sc as T1
    inner join sc as T2 on T2.[Date] = dateadd(dd, -1, T1.Date) and T2.[Config Number] = T1.[Config Number]
于 2013-08-27T18:32:48.387 回答
1

我们可以通过将表连接到自身来使用“自连接”,但要规定连续天数。将其转换为更新如下:

update a
set a.[Status] = b.[Status]
from sc as a
    join sc as b on a.[Config Number] = b.[ConfigNumber]
        and a.[Date] = dateadd(dd, 1, b.[Date])

这将更新与 Config Number 匹配的连续记录。我假设您的“更新后”演示数据最后有错误的重复记录。

此外,作为一般要点:

  • 尝试使用ISO 8601日期格式来消除日期中的歧义(例如“2013-09-20”)。
  • 不要在列名中使用空格。
  • 尽量避免使用关键字作为列名。
于 2013-08-27T18:36:11.360 回答