[英]SQL: select max(A), B but don't want to group by or aggregate 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 因為我確實需要進行連接,只是試圖簡化查詢以澄清問題..
在標准 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;
一種選擇是WITH TIES
並且最好使用顯式JOIN
如果你想看dense_rank()
,把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)
您可以按 create_date 訂購,然后選擇前 1 個:
select top 1 house.house_id, room.create_date, room.color
from house, room
where house.house_id = room.house_id
and house.house_id = 5
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.