将 Max() 与 GROUP BY 的其他字段一起使用 [重复]
Posted
技术标签:
【中文标题】将 Max() 与 GROUP BY 的其他字段一起使用 [重复]【英文标题】:Using Max() with other field with GROUP BY [duplicate] 【发布时间】:2021-10-03 18:00:30 【问题描述】:我在 SQL SERVER 中有下表:
CREATE TABLE cats
(
name VARCHAR(10),
breed VARCHAR(25),
weight decimal(8,2),
color VARCHAR(25),
age int
)
INSERT INTO @cats VALUES('Ashes','Persian',4.5,'Black',5)
INSERT INTO @cats VALUES('Molly','Persian',4.2,'Black',1)
INSERT INTO @cats VALUES('Felix','Persian',5.0,'Tortoiseshell',2)
INSERT INTO @cats VALUES('Smudge','British Shorthair',4.9,'Black',4)
INSERT INTO @cats VALUES('Tigger','British Shorthair',3.8,'Tortoiseshell',2)
INSERT INTO @cats VALUES('Alfie','Siamese',5.5,'Brown',5)
INSERT INTO @cats VALUES('Oscar','Siamese',6.1,'Black',1)
INSERT INTO @cats VALUES('Millie','Maine Coon',5.4,'Tortoiseshell',5)
INSERT INTO @cats VALUES('Misty','Maine Coon',5.7,'Brown',2)
INSERT INTO @cats VALUES('Puss','Maine Coon',5.1,'Tortoiseshell',2)
INSERT INTO @cats VALUES('Smokey','Maine Coon',6.1,'Brown',4)
INSERT INTO @cats VALUES('Charlie','British Shorthair',4.8,'Black',4)
我需要为每个(颜色)选择\查看最古老的猫,以及它的名字。
使用GROUP BY color
非常容易,但问题是当您添加名称时,所有内容都错过了。
我想我应该使用OVER()
、Partition BY
或RANK()
/DENSE_RANK
...我都尝试了它们,但我卡住了。请帮我解决这个问题。
谢谢!
【问题讨论】:
“我都试过了,但我卡住了”——用什么?请说明您到目前为止尝试了什么以及有什么问题 【参考方案1】:这是一种方法:
select * from (
select *, row_number() over(partition by color order by age desc) rn from cats
) t where rn = 1
db小提琴here
【讨论】:
【参考方案2】:另一种方式,使用相关子查询:
拨弄http://sqlfiddle.com/#!18/798bd7/3。
select
(select top 1 name from cats c
where c.age = tmp.maxage
and c.color = tmp.color) name,
color,
maxage
from (
select color, max(age) as maxage
from cats
group by color
) tmp
【讨论】:
【参考方案3】:SELECT DISTINCT
color
, [max] = max(age) over (partition by color)
FROM cats
【讨论】:
以上是关于将 Max() 与 GROUP BY 的其他字段一起使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
UNION ALL和order by 的关系,group by 和字段的关系,以及MAX函数