在按两列分组时选择最大值,并在另一列上排序

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 划分,按结果描述的市场订单,元素描述)作为”附近使用正确的语法

以上是关于在按两列分组时选择最大值,并在另一列上排序的主要内容,如果未能解决你的问题,请参考以下文章

按两列排序,为啥不先分组呢?

在一个列上应用 distinct 并在另一列上按 count 排序

熊猫在一列上分组,另一列上的最大日期python

Pandas 数据框:按两列分组,然后对另一列进行平均

选择一列上的值在另一列上具有相同的一组值

从数据框中删除重复项,基于两列 A,B,在另一列 C 中保持具有最大值的行