按两列分组并在另一列上排序时选择最大值
Selecting max value while group by two columns with order on another column
我有 4 行 table
id season_id market elements
我想 select 为每个相同的 season_id 持有最大结果的市场,如果最大结果相同,则仅基于元素高于 9 的元素的最大值。
id | season_id | market | result | elements
1 | 20 | fh | 75 | 20
2 | 20 | fh | 75 | 22
3 | 20 | SH | 81 | 18
4 | 20 | SH | 75 | 20
5 | 21 | fh | 90 | 14
6 | 21 | fh | 86 | 16
7 | 21 | SH | 90 | 18
8 | 21 | SH | 91 | 2
我想得到
id | season_id | market | result | elements
2 | 20 | fh | 75 | 22
3 | 20 | SH | 81 | 18
5 | 21 | fh | 90 | 14
7 | 21 | SH | 90 | 18
我试过了
SELECT a.* FROM results a INNER JOIN (SELECT id, market, MAX(result) as perc FROM
results where elements>9 group by market ) group ON a.market = group.market and
a.result = group.perc group by market
但它并不是 select 所有市场,我不确定如何添加 selection 按元素数量
您似乎希望每个 season_id
/market
对有一个结果。我不是 100% 确定 elements > 9
的限制应该做什么,但我认为这是一个整体过滤器。
要获取每个季节和市场的最大结果和元素的行,请使用 row_number()
:
select t.*
from (select t.*,
row_number() over (partition by season_id, market order by result desc, elements desc) as seqnum
from t
where elements > 9
) t
where seqnum = 1;
Here 是一个 db<>fiddle.
在 MySQL 的旧版本(或更新的版本)中,您可以使用相关子查询:
select t.*
from t
where t.id = (select t2.id
from t t2
where t2.season_id = t.season_id and t2.market = t.market and
t2.elements > 9
order by t2.result desc, t2.elements desc
limit 1
);
我有 4 行 table
id season_id market elements
我想 select 为每个相同的 season_id 持有最大结果的市场,如果最大结果相同,则仅基于元素高于 9 的元素的最大值。
id | season_id | market | result | elements
1 | 20 | fh | 75 | 20
2 | 20 | fh | 75 | 22
3 | 20 | SH | 81 | 18
4 | 20 | SH | 75 | 20
5 | 21 | fh | 90 | 14
6 | 21 | fh | 86 | 16
7 | 21 | SH | 90 | 18
8 | 21 | SH | 91 | 2
我想得到
id | season_id | market | result | elements
2 | 20 | fh | 75 | 22
3 | 20 | SH | 81 | 18
5 | 21 | fh | 90 | 14
7 | 21 | SH | 90 | 18
我试过了
SELECT a.* FROM results a INNER JOIN (SELECT id, market, MAX(result) as perc FROM
results where elements>9 group by market ) group ON a.market = group.market and
a.result = group.perc group by market
但它并不是 select 所有市场,我不确定如何添加 selection 按元素数量
您似乎希望每个 season_id
/market
对有一个结果。我不是 100% 确定 elements > 9
的限制应该做什么,但我认为这是一个整体过滤器。
要获取每个季节和市场的最大结果和元素的行,请使用 row_number()
:
select t.*
from (select t.*,
row_number() over (partition by season_id, market order by result desc, elements desc) as seqnum
from t
where elements > 9
) t
where seqnum = 1;
Here 是一个 db<>fiddle.
在 MySQL 的旧版本(或更新的版本)中,您可以使用相关子查询:
select t.*
from t
where t.id = (select t2.id
from t t2
where t2.season_id = t.season_id and t2.market = t.market and
t2.elements > 9
order by t2.result desc, t2.elements desc
limit 1
);