SQL Server更新字段最大值数据子集

时间:2017-11-14 14:14:39

标签: sql sql-update max dateadd

我正在尝试根据表格中的数据子集更新字段。如果装配需要3个具有不同到达日期的组件,但只能在所有三个组件到达后组装,我该如何更新已完成的字段? Complete字段需要是类似程序集之间的DateAdd的Max,但我不知道如何根据程序集定义要比较的WHERE语句。

样本数据

SN      Assembly  Arrival       ProcessingDays
1000    A1        2017-07-03    2               
1001    A1        2017-06-02    2
1002    A1        2017-05-01    2
1003    A2        2017-12-15    2  
1004    A3        2017-07-03    2
1005    A3        2017-06-02    2
1006    A3        2017-05-01    2

期望输出

SN      Assembly  Arrival       ProcessingDays  Complete
1000    A1        2017-07-03    2               2017-07-05
1001    A1        2017-06-02    2               2017-07-05
1002    A1        2017-05-01    2               2017-07-05
1003    A2        2017-12-15    2               2017-12-17
1004    A3        2017-09-03    2               2017-09-05
1005    A3        2017-08-02    2               2017-09-05
1006    A3        2017-07-01    2               2017-09-05

1 个答案:

答案 0 :(得分:1)

我不知道您是否真的要更新您的表格或仅生成Complete列,但以下CTE应该在正确的轨道上。你问的问题就是,除了最大日期之外,还必须确定每个组件最新记录的处理天数。为此,我在下面使用两步CTE。

WITH cte1 AS (
    SELECT SN, Assembly, Arrival, ProcessingDays,
        ROW_NUMBER() OVER (PARTITION BY Assembly ORDER BY Arrival DESC) rn
    FROM yourTable
),
cte2 AS (
    SELECT t1.SN, t1.Assembly, t1.Arrival, t1.ProcessingDays, t1.Complete,
        DATEADD(dd, t2.ProcessingDays, t2.Arrival) AS NewComplete
    FROM yourTable t1
    INNER JOIN cte1 t2
        ON t1.Assembly = t2.Assembly
    WHERE
        t2.rn = 1
)

CTE在很多方面都很有用,包括使用复杂的逻辑更容易更新表,但这很容易。现在,我们可以按如下方式更新您的Complete列:

UPDATE cte2
SET Complete = NewComplete;

这是一个全面的更新,这是您的问题似乎意味着您想要的,但如果有意义,您可以自由地在上述更新中添加WHERE子句。