我有三列表如下所示
| 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 |我想要生成另一个表,每个类别的最大值,所需的表应该如下所示。
| Category | Author | Sales |
+++++++++++++++++++++++++++++++++++++++
| NW | account-3 | 30 |
| S | account-6 | 55 |我的编码试验,
SELECT Category, Author, MAX(Sales)
FROM table
GROUP BY Category, Author我不知道为什么MAX()聚合失败(上面的代码)。如果有人能详细解释原因,并提供一个简单有效的解决方案,我将不胜感激。
发布于 2018-09-05 13:02:50
要解决您的问题,您需要一个子查询。
说明:您的当前解决方案无法工作,因为您的不过滤对max( sales )的原始查询的,而只是问“此类别的最大销售额是什么?”因此,您需要另一个子查询,即
下面的代码应该可以工作:
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,但这不应该起到很大的作用)
如果你有任何问题或需要更多的指导,请毫不犹豫地给我留言或留言。
发布于 2018-09-01 19:56:51
为此,我建议使用相关子查询:
select t.*
from t
where t.sales = (select max(t2.sales) from t t2 where t2.category = t.category);特别是,几乎任何数据库都会利用(category, sales)上的索引--如果可用的话--来优化这个查询。
查询的问题是,您正在通过category和author进行聚合。您希望在category中获得最大的销售额。你想要作者拥有最大的销售额。这与max(author)或author聚合不同。
发布于 2018-09-04 21:12:58
因为Group by是一个组,所以当您使用GROUP BY Category, Author时,您需要使用group by by Category和Author列,所以有六个组。
查询
select Category,Author
from t
group by Category,Author结果
| Category | Author |
|----------|-----------|
| NW | account-1 |
| NW | account-2 |
| NW | account-3 |
| S | account-4 |
| S | account-5 |
| S | account-6 |但如果我们只做group by Category,有两组。
查询
select Category
from t
group by Category结果
| Category |
|----------|
| NW |
| S |因此,您可以尝试获取MAX Sales列group by Category,然后加入或连接Sales和Category
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
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
)结果
| Category | Author | Sales |
|----------|-----------|-------|
| NW | account-3 | 30 |
| S | account-6 | 55 |https://stackoverflow.com/questions/52131269
复制相似问题