在按两列分组时选择最大值,并在另一列上排序
Posted
技术标签:
【中文标题】在按两列分组时选择最大值,并在另一列上排序【英文标题】:Selecting max value while group by two columns with order on another column 【发布时间】:2021-03-15 11:41:42 【问题描述】:我有 4 行的表
id season_id market elements
我想为每个相同的 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
但它并没有选择所有市场,我不确定如何按元素数量向其中添加选择
【问题讨论】:
我不明白对元素的限制> 9.如果没有怎么办? 然后跳过这条记录 是否有多个记录(这里指 3 及以上)具有相同的 season_id 和 market 还是总是 1 或 2? market 和 season_id 上有多个记录,但每个季节 id 的市场编号和名称都相同 【参考方案1】:您似乎希望每个 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 是一个 dbfiddle。
在旧版本的 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
);
【讨论】:
谢谢,我可以看到这个解决方案正在运行,但我没有提到该表有 150k 行并且此查询需要很长时间才能完成请求 @user2741313 。 . .第一个查询应该没问题。无论如何,(season_id, market, result desc, elements desc, id)
上的索引应该有助于任一查询。
所以第一个查询不起作用我收到错误,在所有列上创建索引后,第二个查询起作用但它花费了 50 多秒。你认为有办法提高它的性能吗
为什么第一个查询不起作用?我有一个 dbfiddle 表明两者都有效。
#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“(按季节 ID 划分,按结果描述的市场订单,元素描述)作为”附近使用正确的语法以上是关于在按两列分组时选择最大值,并在另一列上排序的主要内容,如果未能解决你的问题,请参考以下文章