我有一个表,其中包括名称,项目,类型和每个项目的计数。我需要找到一种方法来确定每种类型中具有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(计数)的每个人的姓名。这是我的预期结果:
----------------------------
| name | type | count |
| -------------------------|
| Dave | vegetable | 5 |
| Jon | cheese | 9 |
我试图看看除了查询每个名字之外是否有一种优雅的方式,然后手动计算MAX。
答案 0 :(得分: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,他会出现在蔬菜和奶酪的顶部。
答案 1 :(得分:2)
首先计算每个名称/类别组合的总数。在子查询或视图中执行此操作。我将选择一个视图来减少代码膨胀,因为它将不止一次需要。
CREATE VIEW totals AS
SELECT name, type, SUM(count) AS count
FROM yourtable
GROUP BY name, type
---------------------------- | name | type | count | | -------------------------| | Dave | vegetable | 5 | | Tony | vegetable | 3 | | Tom | vegetable | 2 | | Jon | cheese | 9 | | Mark | cheese | 5 | ----------------------------
现在您需要找到每种类型的最大数量。
SELECT type, MAX(count) AS max_count
FROM totals
GROUP BY type
------------------------- | type | max_count | | ----------------------- | vegetable | 5 | | cheese | 9 | -------------------------
现在,您只需查询视图totals
,其中(type,count)等于第二个结果集中的任何对。我已经为你完成了大部分工作。我会让你完成它。
答案 2 :(得分: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