使用 MySQL 将排名变量添加到数据库
Add ranking variable to database with MySQL
我有一个具有以下结构的数据库:
ID GROUP VALUE RANK
2 1 999 0
1 1 888 0
3 2 777 0
4 2 111 0
我需要根据“VALUE”列对 ID 进行排名并按“GROUP”列进行分组来更新“RANK”列。基本上,在上面的示例中,我应该以:
ID GROUP VALUE RANK
2 1 999 1
1 1 888 2
3 2 777 1
4 2 111 2
我尝试了另一个答案并稍微更改了查询:
SET @r=0;
UPDATE `table` SET `RANK` = @r:= (@r+1) ORDER BY `VALUE` DESC;
至
SET @r=0;
UPDATE `table` SET `RANK` = @r:= (@r+1) PARTITION BY `GROUP` ORDER BY `VALUE` DESC;
但这会引发错误。或者,这种方法产生正确的排名:
SELECT `ID`,
RANK() OVER (PARTITION BY `GROUP` ORDER BY `VALUE`) as `RANK`
FROM table;
但它不会更新数据库中的“RANK”列。与第一个解决方案相比,我更喜欢第二个解决方案,但是如何将查询的输出保存到 RANK 列?
在 UPDATE
语句中将 table 加入到您的最后一个查询中(也在 ORDER BY
子句中使用 DESC
):
UPDATE tablename t
INNER JOIN (
SELECT id, RANK() OVER (PARTITION BY `GROUP` ORDER BY `VALUE` DESC) AS `RANK`
FROM tablename
) r ON r.ID = t.ID
SET t.`RANK` = r.`RANK`;
我有一个具有以下结构的数据库:
ID GROUP VALUE RANK
2 1 999 0
1 1 888 0
3 2 777 0
4 2 111 0
我需要根据“VALUE”列对 ID 进行排名并按“GROUP”列进行分组来更新“RANK”列。基本上,在上面的示例中,我应该以:
ID GROUP VALUE RANK
2 1 999 1
1 1 888 2
3 2 777 1
4 2 111 2
我尝试了另一个答案并稍微更改了查询:
SET @r=0;
UPDATE `table` SET `RANK` = @r:= (@r+1) ORDER BY `VALUE` DESC;
至
SET @r=0;
UPDATE `table` SET `RANK` = @r:= (@r+1) PARTITION BY `GROUP` ORDER BY `VALUE` DESC;
但这会引发错误。或者,这种方法产生正确的排名:
SELECT `ID`,
RANK() OVER (PARTITION BY `GROUP` ORDER BY `VALUE`) as `RANK`
FROM table;
但它不会更新数据库中的“RANK”列。与第一个解决方案相比,我更喜欢第二个解决方案,但是如何将查询的输出保存到 RANK 列?
在 UPDATE
语句中将 table 加入到您的最后一个查询中(也在 ORDER BY
子句中使用 DESC
):
UPDATE tablename t
INNER JOIN (
SELECT id, RANK() OVER (PARTITION BY `GROUP` ORDER BY `VALUE` DESC) AS `RANK`
FROM tablename
) r ON r.ID = t.ID
SET t.`RANK` = r.`RANK`;