不与 MAX 和 GROUP BY 聚合
non aggregate with MAX, and GROUP BY
我有以下来自子查询的 table:
+----------+--------+--------+
| 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。但是当我尝试在 'number' 上使用 MAX 并按 'category' 分组时,我收到非聚合 [=28=].
的错误
这是我到目前为止的进展:
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,错误说它不是 table.
任何帮助将不胜感激:
+----------+--------+--------+
| category | Number | Person |
+----------+--------+--------+
| Fishing | 32 | p3 |
| Reading | 45 | p3 |
| Surfing | 20 | p2 |
+----------+--------+--------+
您需要过滤,而不是聚合。一个选项使用 window 函数,在 MySQL 8.0:
中可用
select *
from (
select t.*, rank() over(partition by category order by number desc) rn
from (...) t
) t
where rn = 1
在正常情况下,您应该能够将 window 函数下推到复杂的子查询中,这样可以节省一层嵌套。
请注意 rank()
允许平局(如果有)。如果您不想那样,您可以使用 row_number()
代替 - 但是,如果有平局,您的结果将不稳定:最好有另一个排序标准来打破平局。
我有以下来自子查询的 table:
+----------+--------+--------+
| 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。但是当我尝试在 'number' 上使用 MAX 并按 'category' 分组时,我收到非聚合 [=28=].
的错误这是我到目前为止的进展:
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,错误说它不是 table.
任何帮助将不胜感激:
+----------+--------+--------+
| category | Number | Person |
+----------+--------+--------+
| Fishing | 32 | p3 |
| Reading | 45 | p3 |
| Surfing | 20 | p2 |
+----------+--------+--------+
您需要过滤,而不是聚合。一个选项使用 window 函数,在 MySQL 8.0:
中可用select *
from (
select t.*, rank() over(partition by category order by number desc) rn
from (...) t
) t
where rn = 1
在正常情况下,您应该能够将 window 函数下推到复杂的子查询中,这样可以节省一层嵌套。
请注意 rank()
允许平局(如果有)。如果您不想那样,您可以使用 row_number()
代替 - 但是,如果有平局,您的结果将不稳定:最好有另一个排序标准来打破平局。