如何将表中某列值设为同表中一周前对应行的另一列值
同表更新:将fldState设为对应日期提前一周的companyName值
需求说明:需要更新company_table表中的fldState列,让该列的值等于当前行日期提前7天的记录的companyName值。
原表示例
fldId | companyName | date | fldState --------------------------------------------- 1 | adeco | 2023-06-18 | 2 | mic | 2023-06-17 | 3 | manpower | 2023-06-16 | 4 | linar | 2023-06-15 | 5 | dlank | 2023-06-14 | 5 | test | 2023-06-13 | 5 | tesla | 2023-06-12 | 5 | apple | 2023-06-11 |
更新后效果示例
fldId | companyName | date | fldState --------------------------------------------- 1 | adeco | 2023-06-18 | tesla 2 | mic | 2023-06-17 | apple 3 | manpower | 2023-06-16 | ... 4 | linar | 2023-06-15 | 5 | dlank | 2023-06-14 | 5 | test | 2023-06-13 | 5 | tesla | 2023-06-12 | 5 | apple | 2023-06-11 |
解决方案
根据不同数据库类型,提供对应的SQL语句:
1. MySQL/MariaDB
使用自连接关联日期减7天的记录,通过LEFT JOIN确保无匹配记录时fldState设为NULL:
UPDATE company_table t1 LEFT JOIN company_table t2 ON DATE_SUB(t1.date, INTERVAL 7 DAY) = t2.date SET t1.fldState = t2.companyName;
2. PostgreSQL
利用INTERVAL语法实现日期偏移,同样使用自连接:
UPDATE company_table t1 SET fldState = t2.companyName FROM company_table t2 WHERE t1.date - INTERVAL '7 days' = t2.date;
如果需要保留无匹配时的原有值(而非设为NULL),可以添加COALESCE:
UPDATE company_table t1 SET fldState = COALESCE(t2.companyName, t1.fldState) FROM company_table t2 WHERE t1.date - INTERVAL '7 days' = t2.date;
3. SQL Server
使用DATEADD函数处理日期计算:
UPDATE t1 SET t1.fldState = t2.companyName FROM company_table t1 LEFT JOIN company_table t2 ON DATEADD(DAY, -7, t1.date) = t2.date;
逻辑说明
所有方案核心都是通过自连接将当前记录与日期提前7天的记录关联,直接把关联到的companyName赋值给当前行的fldState。如果某行没有对应的提前7天记录,fldState会保持为NULL(或原有值,取决于写法),和示例中的效果一致。
内容的提问来源于stack exchange,提问作者Morteza Hasanabadi
相关产品推荐
相关产品推荐

