Mysql 使用两个条件更新sql中的列
我在mysql中有一个表,我想将名为status的列中的记录更新为Duplicate。我想根据两个条件标记一个记录“重复” 这些记录具有重复的客户id 没有最近修改日期的记录将被标记为重复 我尝试了以下代码,但它给了我一个错误:Mysql 使用两个条件更新sql中的列,mysql,sql,sql-update,Mysql,Sql,Sql Update,我在mysql中有一个表,我想将名为status的列中的记录更新为Duplicate。我想根据两个条件标记一个记录“重复” 这些记录具有重复的客户id 没有最近修改日期的记录将被标记为重复 我尝试了以下代码,但它给了我一个错误: UPDATE test_sql_duplicate SET status = 'Duplicate' WHERE test_sql_duplicate.modi_date NOT IN ( SELECT *, max(modi_date) FROM t
UPDATE test_sql_duplicate
SET status = 'Duplicate'
WHERE test_sql_duplicate.modi_date NOT IN (
SELECT *, max(modi_date)
FROM test_sql_duplicate
GROUP BY cust_id
HAVING COUNT(cust_id > 1)
我想我们可能需要这样的查询:
UPDATE TEST_SQL_DUPLICATE t
JOIN (
SELECT n.cust_id
, MAX(n.modi_date) AS max_modi_date
FROM TEST_SQL_DUPLICATE n
GROUP
BY n.cust_id
HAVING COUNT(n.cust_id) > 1
) d
ON d.cust_id = t.cust_id
AND d.max_modi_date > t.modi_date
SET t.status = 'Duplicate'
给定样本数据:
_row cust_id modi_date
------- ----------
1 444 2019-10-28
2 444 2019-10-28
3 444 2019-10-29
4 444 2019-10-30
5 444 2019-10-30
此答案中的查询将标记行1到3,将状态列设置为“重复”。第4行和第5行不会被标记,因为它们都具有相同的最大修改日期
如果从内联视图查询中省略HAVING子句,我们也会得到相同的结果。您可以使用左连接反模式来标识要更新的记录。基本上,我们使用子查询来识别每个客户的最新记录,然后使用它从更新查询中排除相应的记录:
UPDATE test_sql_duplicate t
LEFT JOIN (
SELECT cust_id, MAX(modi_date) modi_date FROM test_sql_duplicate GROUP BY cust_id
) m ON m.cust_id = t.cust_id and m.modi_date = t.modi_date
SET t.status = 'Duplicate'
WHERE m.cust_id IS NULL
这里有一个快速而肮脏的方法:
UPDATE test_sql_duplicate SET status = 'Duplicate'
WHERE cust_id IN (
SELECT t.id FROM (
SELECT
modi_date date,
cust_id id,
COUNT(*) OVER(PARTITION BY cust_id) cnt,
MAX(modi_date) OVER() maxDate
FROM test_sql_duplicate
) t
WHERE t.date < maxDate OR t.cnt > 1);
子查询不在时只允许返回1列。欢迎使用StackOverflow!请编辑您的答案,包括对代码的解释。这将使其更有用,更有可能被接受/投票: