按列分组和 select 行中具有多个最小值的所有字段
Group by column and select all fields in rows with multiple minimum values
我需要select一行中的所有字段按某个字段分组并包含另一个字段(点)的最小值,使用另一个字段来打破平局(id)。
数据示例:
id
game
points
hash
1
x
5
ax8
1
z
4
bc4
2
y
2
df8
2
x
1
fd8
3
x
2
fda0
3
y
2
fzlf
3
z
2
z89w
期望的结果:
id
game
point
hash
2
x
1
fd8
2
y
2
df8
3
z
2
z89w
所以我想return每场比赛得分最低的行和得分的id。请注意,如果出现平局,例如在游戏 y 中,id 3 和 2 都得了 2 分,我想要 id 为 2 的行。在实际 table 中,有更多字段包含相关数据。
当前解决方案:
SELECT g1.*
FROM games g1
INNER JOIN
(
SELECT game, MIN(Point) MinPoint
FROM games g2
GROUP BY game
) g2
ON g1.game = g2.game AND g1.point = g2.MinPoint
但是,我得到重复的行,其中两个 id 在游戏中得分相同。
您还必须在顶部查询进行分组,因为联接会连接所有数据集。
用ROW_NUMBER
对你的行进行排名:
select id, game, points
from
(
select
g.*,
row_number() over (partition by game
order by points, id) as rn
from games g
) ranked
where rn = 1
order by game;
这需要MySQL8.
另一种解决方案:select 所有不存在更好行的行。
select *
from games g
where not exist
(
select null
from games g2
where g2.game = g.game
and
(
g2.points < g.points
or
(g2.points = g.points and g2.id < g.id)
)
)
order by game;
我需要select一行中的所有字段按某个字段分组并包含另一个字段(点)的最小值,使用另一个字段来打破平局(id)。
数据示例:
id | game | points | hash |
---|---|---|---|
1 | x | 5 | ax8 |
1 | z | 4 | bc4 |
2 | y | 2 | df8 |
2 | x | 1 | fd8 |
3 | x | 2 | fda0 |
3 | y | 2 | fzlf |
3 | z | 2 | z89w |
期望的结果:
id | game | point | hash |
---|---|---|---|
2 | x | 1 | fd8 |
2 | y | 2 | df8 |
3 | z | 2 | z89w |
所以我想return每场比赛得分最低的行和得分的id。请注意,如果出现平局,例如在游戏 y 中,id 3 和 2 都得了 2 分,我想要 id 为 2 的行。在实际 table 中,有更多字段包含相关数据。
当前解决方案:
SELECT g1.*
FROM games g1
INNER JOIN
(
SELECT game, MIN(Point) MinPoint
FROM games g2
GROUP BY game
) g2
ON g1.game = g2.game AND g1.point = g2.MinPoint
但是,我得到重复的行,其中两个 id 在游戏中得分相同。
您还必须在顶部查询进行分组,因为联接会连接所有数据集。
用ROW_NUMBER
对你的行进行排名:
select id, game, points
from
(
select
g.*,
row_number() over (partition by game
order by points, id) as rn
from games g
) ranked
where rn = 1
order by game;
这需要MySQL8.
另一种解决方案:select 所有不存在更好行的行。
select *
from games g
where not exist
(
select null
from games g2
where g2.game = g.game
and
(
g2.points < g.points
or
(g2.points = g.points and g2.id < g.id)
)
)
order by game;