"Merging" 两行取 MySQL 中的最低列值
"Merging" two rows by taking the lowest column value in MySQL
我有一个 MySQL table 类似于:
userId | cubeSize | solveTime
-----------------------------
1 | 5 | 24.34
2 | 5 | 35.6
1 | 8 | 130.04
2 | 8 | 125.30
3 | 15 | 405.23
table的复合主键是(userId, cubeSize)。
有时,我想“合并”两个用户。假设我们将用户 2 合并到用户 1。我想要做的是为每个多维数据集大小获取用户 1 和 2 的最低 solveTime 并删除用户 2 的行。结果是:
userId | cubeSize | solveTime
-----------------------------
1 | 5 | 24.34
1 | 8 | 125.30
3 | 15 | 405.23
有人对我如何实现这一目标有任何想法吗?我想这可能可以使用 GROUP BY
在一两个查询中完成,但我对 SQL 没有足够的信心来确定。
如果您想要每个 cubeSize
具有最小 solveTime
的行,那么一个选项使用子查询进行过滤:
select t.*
from mytable t
where solveTime = (select min(t1.solveTime) from mytable t1 where t1.cubeSize = t.cubeSize)
或者,如果您是 运行 MySQL 8.0,您可以使用 window 功能:
select *
from (
select t.*, rank() over(partition by cubeSize order by solveTime) rn
from mytable t
) t
where rn = 1
如果您想删除“其他行”,则:
delete t
from mytable t
inner join (
select cubeSize, min(solveTime) minSolveTime
from mytable
group by cubeSize
) t1
on t1.cubeSize = t.cubeSize and t1.minSolveTime < t.solveTime
我认为您只想按立方体大小分组并获得其他列的最小值。你可以这样做:
select min(userId), cubeSize, min(solveTime) from t group by cubeSize
我有一个 MySQL table 类似于:
userId | cubeSize | solveTime
-----------------------------
1 | 5 | 24.34
2 | 5 | 35.6
1 | 8 | 130.04
2 | 8 | 125.30
3 | 15 | 405.23
table的复合主键是(userId, cubeSize)。
有时,我想“合并”两个用户。假设我们将用户 2 合并到用户 1。我想要做的是为每个多维数据集大小获取用户 1 和 2 的最低 solveTime 并删除用户 2 的行。结果是:
userId | cubeSize | solveTime
-----------------------------
1 | 5 | 24.34
1 | 8 | 125.30
3 | 15 | 405.23
有人对我如何实现这一目标有任何想法吗?我想这可能可以使用 GROUP BY
在一两个查询中完成,但我对 SQL 没有足够的信心来确定。
如果您想要每个 cubeSize
具有最小 solveTime
的行,那么一个选项使用子查询进行过滤:
select t.*
from mytable t
where solveTime = (select min(t1.solveTime) from mytable t1 where t1.cubeSize = t.cubeSize)
或者,如果您是 运行 MySQL 8.0,您可以使用 window 功能:
select *
from (
select t.*, rank() over(partition by cubeSize order by solveTime) rn
from mytable t
) t
where rn = 1
如果您想删除“其他行”,则:
delete t
from mytable t
inner join (
select cubeSize, min(solveTime) minSolveTime
from mytable
group by cubeSize
) t1
on t1.cubeSize = t.cubeSize and t1.minSolveTime < t.solveTime
我认为您只想按立方体大小分组并获得其他列的最小值。你可以这样做:
select min(userId), cubeSize, min(solveTime) from t group by cubeSize