非聚合与 MAX 和 GROUP BY

Posted

技术标签:

【中文标题】非聚合与 MAX 和 GROUP BY【英文标题】:non aggregate with MAX, and GROUP BY 【发布时间】:2021-02-03 11:58:02 【问题描述】:

我有来自子查询的下表:

+----------+--------+--------+
| category | Number | Person |
+----------+--------+--------+
| Fishing  |      3 | p1     |
| Fishing  |    31  | p2     |
| Fishing  |    32  | p3     |
| Reading  |    25  | p2     |
| Reading  |    45  | p3     |
| Reading  |     8  | p1     |
| Surfing  |     8  | p1     |
| Surfing  |    17  | p3     |
| Surfing  |    20  | p2     |
+----------+--------+--------+

我正在尝试获得每个类别都有 MAX 的响应,例如冲浪 20 p2。但是,当我尝试对“数字”进行 MAX 设置并按“类别”分组时,出现非聚合“人员”的错误。

到目前为止,我已经做到了:

SELECT
    subQry.category,
    subQry.number,
    subQry.person
FROM
    (
    #complicated multiple joins to get the summed up table above.
) AS subQry

如前所述,如果我执行 MAX(subQry.total) 和 GROUP BY 'Category',我会在 'person' 上得到非聚合错误。

我尝试了几件事,但我是新手,不太了解它们如何适合我的场景。一个有意义但抛出错误的是这里的最高答案:Get records with max value for each group of grouped SQL results,但我不能在 subQry 上自行加入,错误说它不是表。

任何帮助将不胜感激:

+----------+--------+--------+
| category | Number | Person |
+----------+--------+--------+
| Fishing  |    32  | p3     |
| Reading  |    45  | p3     |
| Surfing  |    20  | p2     |
+----------+--------+--------+

【问题讨论】:

【参考方案1】:

您需要过滤,而不是聚合。一种选择使用 mysql 8.0 中可用的窗口函数:

select *
from (
    select t.*, rank() over(partition by category order by number desc) rn
    from (...) t
) t
where rn = 1

在正常情况下,您应该能够将窗口函数下推到复杂的子查询中,这样可以节省一层嵌套。

请注意,rank() 允许绑定(如果有)。如果您不希望这样,您可以改用row_number() - 但是,如果存在平局,您的结果将不稳定:最好有另一个排序标准来打破平局。

【讨论】:

如果存在平局,则可以为每个类别显示多个平局。 @user2093601:好的,所以查询应该做你想做的事(当然前提是你运行的是 MySQL 8.0)。 我最初认为你所说的是巫术。但是,在尝试理解它之后,我相信它仍然是巫术,但至少我可以将它与 SQL 语句联系起来。抛开玩笑,感谢您的帮助。经过一些试验和错误后工作得很好。对于像我这样的新手并且不了解过滤器的人,我从这里学到了它来理解这一点:mode.com/sql-tutorial/sql-window-functions

以上是关于非聚合与 MAX 和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

15group by子句与聚合函数

在非聚合中使用聚合结果导致 GROUP BY 出现问题

MySQL 聚合函数MySQL对GROUP BY的处理

聚合函数种类和功能有哪些和分组查询 group by 与 order by的区别?

聚合函数种类和功能有哪些和分组查询 group by 与 order by的区别?

聚合函数种类和功能有哪些和分组查询 group by 与 order by的区别?