SQL 服务器更新字段数据的最大值子集
SQL Server Update Field Max Value Subset of Data
我正在尝试根据 table 中的数据子集更新一个字段。如果一个组件需要 3 个到达日期不同的组件,但只有在所有三个组件都到达后才能组装,我该如何更新已完成的字段? Complete字段需要是like程序集之间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
我不知道你是真的想更新你的 table 还是只生成 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 在很多方面都很有用,包括使用复杂的逻辑轻松更新 table,但方法很简单。现在我们可以按如下方式更新您的 Complete
列:
UPDATE cte2
SET Complete = NewComplete;
这是一揽子更新,您的问题似乎暗示了您想要什么,但如果有意义,您可以在上述更新中自由添加 WHERE
子句。
我正在尝试根据 table 中的数据子集更新一个字段。如果一个组件需要 3 个到达日期不同的组件,但只有在所有三个组件都到达后才能组装,我该如何更新已完成的字段? Complete字段需要是like程序集之间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
我不知道你是真的想更新你的 table 还是只生成 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 在很多方面都很有用,包括使用复杂的逻辑轻松更新 table,但方法很简单。现在我们可以按如下方式更新您的 Complete
列:
UPDATE cte2
SET Complete = NewComplete;
这是一揽子更新,您的问题似乎暗示了您想要什么,但如果有意义,您可以在上述更新中自由添加 WHERE
子句。