MySQL 查询更新除最新行之外的所有 "duplicate"行

标签 mysql group-by max rdbms partition-by

所以...

我有一个表(我们称之为数据位置),就像...

Data Location ID    Data ID    Location Type    Location URL   Status    Date
1                   1          Foo              foo/3          Valid     10-21-2014
2                   1          Bar              bar/1          Valid     10-21-2014
3                   1          Foo              foo/2          Valid     03-20-2013
4                   1          Foo              foo/1          Valid     12-01-2010

……等等。该表有许多不同的数据 ID(为简单起见,我没有显示它们)。这个想法是,给定的数据 ID 和位置类型应该只有 1 个有效条目,正如您在上面看到的,数据 ID 1 的所有 Foo 位置都是有效的(foo/1、foo/2、foo/3) .

有人可以帮我构建一个查询,将所有重复记录(相同的数据 ID 和位置类型)的状态列更新为无效,除了最新的条目。我有一个查询可以识别符合重复条件的行,但我不确定如何将 group by 与 max(或不是 max?)结合起来并更新。似乎分区方式可能是这样,但我对查询有点生疏,所以我很感激任何帮助。所以对于上面的数据,我希望结果是......

Data Location ID    Data ID    Location Type    Location URL   Status    Date
1                   1          Foo              foo/3          Valid     10-21-2014
2                   1          Bar              bar/1          Valid     10-21-2014
3                   1          Foo              foo/2          Invalid   03-20-2013
4                   1          Foo              foo/1          Invalid   12-01-2010

...提前致谢!

最佳答案

您可以使用一个 UPDATE 语句:

UPDATE Data_Location u
INNER JOIN (
  SELECT `Data ID`, `Location Type`, MAX(`Date`) AS max_date
  FROM Data_Location
  GROUP BY `Data ID`, `Location Type`
) t ON u.`Data ID` = t.`Data ID` 
   AND u.`Location Type` = t.`Location Type`
SET u.Status = 'Invalid'
WHERE u.`Date` <> t.max_date

测试SQL Fiddle

关于MySQL 查询更新除最新行之外的所有 "duplicate"行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495121/

相关文章:

mysql - 显示包含最新编辑版本的所有记录

python - 来自 groupby 的 Pandas 累积差异

python - 第一列的最大值

sql - SELECT MAX of COUNT

php - 删除后显示一行的值

mysql - 根据时间关联两个MySQL表

java - 如何根据服务器时间操作mySQL中的参数

python - 抓取字典中字典中值最高的键

MySQL:如何在所有表中级联列类型设置?

java - 如何获取mysql中某一列的所有值