从其他 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;
我有 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;