如果值在组中最高,则将列更新为 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 查询中包含 SELECT
和 UPDATE
。
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...
我有一个 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 查询中包含 SELECT
和 UPDATE
。
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...