如果值在组中最高,则将列更新为 1,否则更新为 0

Update column to 1 if value is highest in group, 0 otherwise

我有一个 table 包含以下列:

player_id, datetime, player_level, is_latest

我需要做的是设置 is_latest = 1,当 datetime 对玩家来说最高时。

这是我检查玩家最高日期时间的方式:

SELECT player_id, MAX(datetime)
FROM players
GROUP BY player_id

现在我需要更新整个 table:

UPDATE players
SET is_latest = /* 1 if datetime = MAX(datetime), 0 otherwise */

您对如何编写 UPDATE 声明有任何想法吗?最好是我可以在单个 SQL 查询中包含 SELECTUPDATE

table 有 3000 万行,所以我想要一个不涉及将所有行复制到其他地方的解决方案。

我不知道这是否是最快的方法,但此查询应该可以满足您的要求并让您了解一般语法:

UPDATE players p
LEFT JOIN (
  SELECT player_id, MAX(datetime) max_date
  FROM players
  GROUP BY player_id
) t ON p.player_id = t.player_id AND p.datetime = t.max_date
SET p.is_latest = (t.max_date IS NOT NULL); 

使用 left join 意味着不匹配 p.datetime = t.max_date 谓词的行将是 null,我们可以在 [=14] 中的布尔表达式中使用这一事实=] 子句以确保只有最新的行将被设置为 1,而较旧的行将被设置为 0。

查看此 SQL Fiddle 示例。

一如既往,在测试更新等方面,请确保 copy/backup...