簡體   English   中英

SQL:選擇 max(A), B 但不想分組或聚合 B

[英]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子句。 根據您的數據庫,您可能需要使用limitselect 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM