Mysql 使用另一列的最大值更新
我有一张表格Mysql 使用另一列的最大值更新,mysql,sql,Mysql,Sql,我有一张表格说明了风险: id | state | municipally | rating 例如: id | state | municipally | rating 1 AG AG1 5 2 AG AG2 6 3 AG AG3 2 4 AG AG4 1 5 AG OTHER - 6
说明了风险
:
id | state | municipally | rating
例如:
id | state | municipally | rating
1 AG AG1 5
2 AG AG2 6
3 AG AG3 2
4 AG AG4 1
5 AG OTHER -
6 AB AB1 0.2
7 AB AB2 2
8 AB AB3 10
9 AB OTHER -
我需要更新
市政=OTHER
的值“rating”,按状态“AG”-“AB”设置MAX(rating)
值,例如:id 5将值设置为6,因为它是状态AG的最大值。这将为您提供最大值
SELECT state, max(rating) as maxrating
FROM states_risk
GROUP BY state
这将为您提供要更新的内容
SELECT id, state
FROM states_risk
WHERE municiplally = 'OTHER'
所以更新是
UPDATE states_risk
SET rating = (
SELECT max(rating) as maxrating
FROM states_risk inner
WHERE inner.state = states_risk.state
)
WHERE municiplally = 'OTHER'
您可以通过将表连接到一个查询来完成此操作,该查询返回每个状态的最大评级:
update states_risk s inner join (
select state, max(rating) rating
from states_risk
group by state
) g on g.state = s.state
set s.rating = g.rating
where s.municipally = 'OTHER';
请参阅。结果:
如果您在他的列中添加了“-”。 您还需要强制转换该列 喜欢 id |州|市|评级 -: | :---- | :---------- | :----- 1 | AG | AG1 | 5 2 | AG | AG2 | 6 3 | AG | AG3 | 2 4 | AG | AG4 | 1 5 | AG |其他| 6 6 | AB | AB1 | 0.2 7 | AB | AB2 | 2 8 | AB | AB3 | 10 9 | AB |其他| 10
dbfiddle请避免用大写字母书写标题;这给人的印象是你在大喊大叫,人们不会想帮助对他们大喊大叫的人。好的,谢谢你@Timlewis没问题!那么,对于您的问题,您是否尝试过编写任何查询来尝试解决这个问题?您收到的具体问题是什么?
| id | state | municipally | rating |
| --- | ----- | ----------- | ------ |
| 1 | AG | AG1 | 5 |
| 2 | AG | AG2 | 6 |
| 3 | AG | AG3 | 2 |
| 4 | AG | AG4 | 1 |
| 5 | AG | OTHER | 6 |
| 6 | AB | AB1 | 0.2 |
| 7 | AB | AB2 | 2 |
| 8 | AB | AB3 | 10 |
| 9 | AB | OTHER | 10 |
select version();
| version() |
| :-------- |
| 8.0.18 |
CREATE TABLE states_risk
(`id` int, `state` varchar(2), `municipally` varchar(5), `rating` varchar(3))
;
INSERT INTO states_risk
(`id`, `state`, `municipally`, `rating`)
VALUES
(1, 'AG', 'AG1', '5'),
(2, 'AG', 'AG2', '6'),
(3, 'AG', 'AG3', '2'),
(4, 'AG', 'AG4', '1'),
(5, 'AG', 'OTHER', '-'),
(6, 'AB', 'AB1', '0.2'),
(7, 'AB', 'AB2', '2'),
(8, 'AB', 'AB3', '10'),
(9, 'AB', 'OTHER', '-')
;
✓
✓
Select * From states_risk;
id | state | municipally | rating
-: | :---- | :---------- | :-----
1 | AG | AG1 | 5
2 | AG | AG2 | 6
3 | AG | AG3 | 2
4 | AG | AG4 | 1
5 | AG | OTHER | -
6 | AB | AB1 | 0.2
7 | AB | AB2 | 2
8 | AB | AB3 | 10
9 | AB | OTHER | -
SELECT state, MAX(CAST(rating as FLOAT)) MAXrating
FROM states_risk WHERE rating <> '-' GROUP BY state
state | MAXrating
:---- | --------:
AG | 6
AB | 10
UPDATE states_risk sr INNER JOIN (SELECT state, MAX(CAST(rating as FLOAT)) MAXrating
FROM states_risk WHERE rating <> '-' GROUP BY state) t1
ON sr.state = t1.state
SET sr.rating = t1.MAXrating WHERE sr.municipally = 'OTHER';
✓
Select * From states_risk;
id | state | municipally | rating
-: | :---- | :---------- | :-----
1 | AG | AG1 | 5
2 | AG | AG2 | 6
3 | AG | AG3 | 2
4 | AG | AG4 | 1
5 | AG | OTHER | 6
6 | AB | AB1 | 0.2
7 | AB | AB2 | 2
8 | AB | AB3 | 10
9 | AB | OTHER | 10