首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据最大类别事件筛选表

根据最大类别事件筛选表
EN

Stack Overflow用户
提问于 2018-09-01 19:00:48
回答 6查看 471关注 0票数 2

我有三列表如下所示

代码语言:javascript
复制
| Category  | Author      | Sales     |
+++++++++++++++++++++++++++++++++++++++
| NW        | account-1   | 10        |
| NW        | account-2   | 20        |
| NW        | account-3   | 30        |
| S         | account-4   | 10        |
| S         | account-5   | 50        |
| S         | account-6   | 55        |

我想要生成另一个表,每个类别的最大值,所需的表应该如下所示。

代码语言:javascript
复制
| Category  | Author      | Sales     |
+++++++++++++++++++++++++++++++++++++++
| NW        | account-3   | 30        |
| S         | account-6   | 55        |

我的编码试验,

代码语言:javascript
复制
SELECT Category, Author, MAX(Sales)
FROM table
GROUP BY Category, Author

我不知道为什么MAX()聚合失败(上面的代码)。如果有人能详细解释原因,并提供一个简单有效的解决方案,我将不胜感激。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-09-05 13:02:50

要解决您的问题,您需要一个子查询

说明:您的当前解决方案无法工作,因为您的不过滤对max( sales )的原始查询的,而只是问“此类别的最大销售额是什么?”因此,您需要另一个子查询,即

  1. 找出每个类别的最大销售量,所以
  2. 然后,您可以在作者和类别组合上筛选原始表,该组合的销售号码与每个类别的最大销售号码相同。

下面的代码应该可以工作:

代码语言:javascript
复制
SELECT tbl_sales.Category, tbl_sales.Author, tbl_sales.Sales
FROM tbl_sales
JOIN(
    SELECT Category, MAX(Sales) MaxSales
    FROM tbl_sales
    GROUP BY Category
    ) tbl_maxsales
ON tbl_sales.Sales = tbl_maxsales.MaxSales

你可以找到这里是一个SQL小提琴实现。

(我假设了MySQL 5.6,但这不应该起到很大的作用)

如果你有任何问题或需要更多的指导,请毫不犹豫地给我留言或留言。

票数 1
EN

Stack Overflow用户

发布于 2018-09-01 19:56:51

为此,我建议使用相关子查询:

代码语言:javascript
复制
select t.*
from t
where t.sales = (select max(t2.sales) from t t2 where t2.category = t.category);

特别是,几乎任何数据库都会利用(category, sales)上的索引--如果可用的话--来优化这个查询。

查询的问题是,您正在通过categoryauthor进行聚合。您希望在category中获得最大的销售额。你想要作者拥有最大的销售额。这与max(author)author聚合不同。

票数 1
EN

Stack Overflow用户

发布于 2018-09-04 21:12:58

因为Group by是一个组,所以当您使用GROUP BY Category, Author时,您需要使用group by by CategoryAuthor列,所以有六个组。

查询

代码语言:javascript
复制
select Category,Author
from t
group by Category,Author

结果

代码语言:javascript
复制
| Category |    Author |
|----------|-----------|
|       NW | account-1 |
|       NW | account-2 |
|       NW | account-3 |
|        S | account-4 |
|        S | account-5 |
|        S | account-6 |

但如果我们只做group by Category,有两组。

查询

代码语言:javascript
复制
select Category
from t
group by Category

结果

代码语言:javascript
复制
| Category |
|----------|
|       NW |
|        S |

因此,您可以尝试获取MAX Sales列group by Category,然后加入或连接Sales和Category

代码语言:javascript
复制
CREATE TABLE T(
    Category varchar(5),
    Author varchar(50),
    Sales int
);


insert into t values ('NW','account-1', 10);
insert into t values ('NW','account-2', 20);
insert into t values ('NW','account-3', 30);
insert into t values ('S','account-4', 10);
insert into t values ('S','account-5', 50);
insert into t values ('S','account-6', 55);

查询1

代码语言:javascript
复制
select * from t t1 where exists(
  SELECT 1
  FROM T tt
  WHERE t1.Category = tt.Category
  GROUP BY tt.Category
  HAVING MAX(tt.Sales) = t1.Sales
)

结果

代码语言:javascript
复制
| Category |    Author | Sales |
|----------|-----------|-------|
|       NW | account-3 |    30 |
|        S | account-6 |    55 |
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52131269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档