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),但我想要具有最大创建日期的房间的颜色。

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

ac2234 回答:SQL:选择 max(A), B 但不想分组或聚合 B

在标准 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 子句。根据您的数据库,您可能需要使用 limitselect top 或其他内容。

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

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

一个选项是 WITH TIES 并且最好使用显式 JOIN

如果您想查看平局,请将 row_number() 更改为 dense_rank()

select top 1 with ties
       house.house_id,room.create_date,room.color
from house
join room  on house.house_id = room.house_id
Where house.house_id = 5
Order by row_number() over (partition by house.house_ID order by room.create_date desc)
,

将此扩展为适用于任意数量的房屋(而不是仅适用于一所房屋)...

SELECT
  house.*,room.*
FROM
  house
OUTER APPLY
(
  SELECT TOP (1) room.create_date,room.color
    FROM room
   WHERE house.house_id = room.house_id
ORDER BY room.create_date DESC
)
  AS room
,

您可以按 create_date 排序,然后选择前 1 个:

select top 1 house.house_id,room.color
from house,room
where house.house_id = room.house_id
and house.house_id = 5
order by room.create_date desc
本文链接:https://www.f2er.com/13659.html

大家都在问