获取具有连续日期(日)的行

时间:2013-08-27 17:46:26

标签: sql sql-server-2005 sql-update

我正在寻找一种方法来更新前一天出现其他行的所有行。

示例:

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

我知道它不起作用,但我无法弄清楚我的查询应该是什么样子。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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])

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

另外,作为一般要点:

  • 尝试使用ISO 8601日期格式来消除日期中的歧义(例如“2013-09-20”)。
  • 不要在列名中使用空格。
  • 尽量避免使用keywords作为列名。