2

我有一个表,其中包括名称、项目、类型和每个项目的计数。我需要找到一种方法来确定每种类型中具有 MAX 计数的名称。

示例表:

---------------------------------------
| name | item     | type      | count |
| ------------------------------------|
| Dave | carrot   | vegetable | 2     |
| Dave | broccoli | vegetable | 3     |
| Tom  | spinach  | vegetable | 2     |
| Jon  | swiss    | cheese    | 3     |
| Mark | cheddar  | cheese    | 5     |
| Jon  | cheddar  | cheese    | 6     |
| Tony | onion    | vegetable | 3     |

我想找到每种类型中 SUM(count) 最高的每个人的名字。这是我的预期结果:

----------------------------
| name | type      | count |
| -------------------------|
| Dave | vegetable | 5     |
| Jon  | cheese    | 9     |

我正在尝试查看是否有一种优雅的方式来执行此操作,而不是查询每个名称然后手动计算 MAX。

4

3 回答 3

3

这可能不是最佳的,但它非常简单:

SELECT name, type, MAX(count) as count FROM (
   SELECT name, type, SUM(count) as count
    FROM mytable
    GROUP BY type, name
) as rank
GROUP BY type;

内部查询返回每个名称和该名称的类型总和,例如:

NAME    TYPE    COUNT
Jon     cheese      9
Dave    vegetable   5
Mark    cheese      5
Tony    vegetable   3
Tom     vegetable   2

然后外部查询按类型分组,因此每种类型只返回一个名称,并且 max() 返回该类型的顶部名称。

这不会返回相同的名称,但会为不同类型返回相同的名称,因此如果突然给 Dave 10 in swiss,他会出现在蔬菜和奶酪的顶部。

于 2012-04-20T06:48:47.533 回答
2

首先计算每个名称/类别组合的总数。在子查询或视图中执行此操作。我将选择一个视图来减少代码膨胀,因为它需要不止一次。

CREATE VIEW totals AS
SELECT name, type, SUM(count) AS count
FROM yourtable
GROUP BY name, type
----------------------------
| 姓名 | 类型 | 计数 |
| --------------------------|
| 戴夫 | 蔬菜| 高分辨率照片| CLIPARTO 5 |
| 托尼 | 蔬菜| 高分辨率照片| CLIPARTO 3 |
| 汤姆 | 蔬菜| 高分辨率照片| CLIPARTO 2 |
| 乔恩 | 奶酪 | 9 |
| 马克 | 奶酪 | 5 |
----------------------------

现在您需要找到每种类型的最大计数。

SELECT type, MAX(count) AS max_count
FROM totals
GROUP BY type
-------------------------
| 类型 | 最大计数 |
| ----------------------
| 蔬菜| 高分辨率照片| CLIPARTO 5 |
| 奶酪 | 9 |
-------------------------

现在您只需要在视图中查询totals(type, count) 等于第二个结果集中的任何对的所有行。我已经为你完成了大部分工作。我会让你完成它。

于 2012-04-20T06:27:45.267 回答
0

没有数据库在我面前,试一试:

SELECT * FROM Table T 
  LEFT JOIN (SELECT type, MAX(count) AS max FROM Table GROUP BY type) AS maxType 
  ON T.type = maxType.type 
    AND t.count = max.count
于 2012-04-19T22:17:10.437 回答