首页 > 解决方案 > SQL:选择 max(A), B 但不想分组或聚合 B

问题描述

如果我有一个有多个房间的房子,但我想要最近创建的颜色,我会说:

select house.house_id, house.street_name, max(room.create_date), room.color
from house, room
where house.house_id = room.house_id
and house.house_id = 5
group by house.house_id, house.street_name

但我得到了错误:

列“room.color”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

如果我说 max(room.color),那么当然,它会给我 max(color) 以及 max(create_date),但我想要具有 MAX 创建日期的房间的颜色。

刚刚添加了 street_name 因为我确实需要进行连接,只是试图简化查询以澄清问题..

标签: sqlsql-servergroup-by

解决方案


在标准 SQL 中,您可以这样写:

select r.house_id, r.create_date, r..color
from room r
where r.house_id = 5
order by r.create_date desc
offset 0 row fetch first 1 row only;

请注意,该house表不是必需的。如果您确实需要其中的列,那么您将使用join/on语法。

并非所有数据库都支持标准offset/fetch子句。您可能需要使用limit,select top或其他东西,具体取决于您的数据库。

以上在 SQL Server 中有效,但可能更常见的写法是:

select top (1) r.house_id, r.create_date, r..color
from room r
where r.house_id = 5
order by r.create_date desc;

推荐阅读