从其他 table 更新 table SQL

Update table SQL from other table

我有 table - 'GroupData' 包含组和日期的数据,以及 table - 'LastData' 每个组的最后日期 - 过去的最后更新. 我尝试编写查询,更新 'LastData' 最后 'LastData' 将包含每组一行并且 date = max(date) < now.

结果 - 每组仅更改 'LastData' 一行。日期将是最大(日期)<现在 - 组号 1 过去有 2 个日期,01-01-2021 大于 01-01-2020 -> 它会在结果中,组 2 只有 1 个日期01-02-2021 和它在过去 -> 它会在结果中,组号 3 不会在结果中,因为未来的日期

组数据

group date
1 01-01-2020
1 01-01-2021
1 01-01-2022
2 01-02-2021
3 01-02-2022

上次数据

group date
1 01-01-2020

结果

group date
1 01-01-2021
2 01-02-2021

一种方法是left join和聚合:

select gd.group,
       coalesce(min(case when gd.date >= ld.date then gd.date end),
                min(gd.date)
               )
from groupData gd left join
     lastData ld
     on gd.group = ld.group        
group by gd.group;

由于您想在插入 lastdata 之前删除匹配的行 table 您可以使用合并。当 lastdata 中有任何组可用时,此查询将检查 groupdata 中的组明智最大日期是否早于 lastdata 中的日期。如果较旧,那么它将更新 lastdata table 否则什么都不做。

如果 groupdata 中有一个组可用但 lastdata 中没有,那么它将插入该行。

merge LastData ld
using(select [group],max(date) DATE from groupdata group by [group]) t ON T.[GROUP]=LD.[GROUP]
WHEN MATCHED AND T.DATE>LD.DATE THEN UPDATE SET LD.DATE=T.DATE
WHEN NOT MATCHED BY TARGET THEN INSERT ([GROUP],DATE)VALUES(T.[GROUP],T.DATE);

如果要在组数据中组不可用时从 lastdata 中删除行,您可以添加 When Not Matched By Source 然后在末尾删除 条件,如下所示:

merge LastData ld
    using(select [group],max(date) DATE from groupdata group by [group]) t ON T.[GROUP]=LD.[GROUP]
    WHEN MATCHED AND T.DATE>LD.DATE THEN UPDATE SET LD.DATE=T.DATE
    WHEN NOT MATCHED BY TARGET THEN INSERT ([GROUP],DATE)VALUES(T.[GROUP],T.DATE)
    WHEN NOT MATCHED BY SOURCE THEN DELETE;