Mysql 使用两个条件更新sql中的列

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

我在mysql中有一个表,我想将名为status的列中的记录更新为Duplicate。我想根据两个条件标记一个记录“重复”

这些记录具有重复的客户id

没有最近修改日期的记录将被标记为重复

我尝试了以下代码,但它给了我一个错误:

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!请编辑您的答案,包括对代码的解释。这将使其更有用,更有可能被接受/投票: