Всегда можно избежать LIMIT 1 или SELECT TOP.Одним из способов является выражение верхней строки как строки, для которой нет верхней строки.WHERE NOT EXISTS выражает идею «для которой нет».
Один из способов думать об этом заключается в следующем: выберите те комнаты (вместе с их общим количеством дней и типовой информацией), для которых нет места.того же типа с большим количеством общих дней.Это дает вам этот запрос (не тщательно вычитанный):
with StayTotals as (
select
STAY.ID_ROOM,
ROOM_TYPE.ID_ROOM_TYPE,
ROOM_TYPE.DESCRIPTION,
SUM(STAY.DAYS_QUANT) AS TotalDays2011
from STAY join ROOM on STAY.ID_ROOM = ROOM.ID_ROOM
join ROOM_TYPE on ROOM.ID_ROOM_TYPE = ROOM_TYPE.ID_ROOM_TYPE
where YEAR(STAY.DATE) = 2011
group by STAY.ID_ROOM, ROOM_TYPE.ID_ROOM_TYPE, ROOM_TYPE.DESCRIPTION
)
select *
from StayTotals as T1
where not exists (
select *
from StayTotals as T2
where T2.ID_ROOM_TYPE = T1.ID_ROOM_TYPE
and T2.TotalDays2011 > T1.TotalDays2011
);
Если вы не можете использовать CTE (предложение WITH), вы можете переписать его, используя подзапросы, но это неудобно.
Функции ранжирования уже давно являются частью стандарта SQL.Если вы можете использовать их, это также может работать:
with StayTotals as (
select
STAY.ID_ROOM,
ROOM_TYPE.ID_ROOM_TYPE,
ROOM_TYPE.DESCRIPTION,
SUM(STAY.DAYS_QUANT) AS TotalDays2011
from STAY join ROOM on STAY.ID_ROOM = ROOM.ID_ROOM
join ROOM_TYPE on ROOM.ID_ROOM_TYPE = ROOM_TYPE.ID_ROOM_TYPE
where YEAR(STAY.DATE) = 2011
group by STAY.ID_ROOM, ROOM_TYPE.ID_ROOM_TYPE, ROOM_TYPE.DESCRIPTION
), StayTotalsRankedByType as (
select
ID_ROOM,
ID_ROOM_TYPE,
DESCRIPTION,
TotalDays2011,
RANK() OVER (
PARTITION BY ID_ROOM_TYPE
ORDER BY TotalDays2011 DESC
) as RankInRoomType
from StayTotals
)
select
ID_ROOM,
ID_ROOM_TYPE,
DESCRIPTION,
TotalDays2011
from StayTotalsRankedByType
where RankInRoomType = 1;
Наконец, еще один способ добавить дополнительные столбцы для описания сгруппированных результатов MAX - это использовать сортировку «carryalong», которая была удобной техникой.до ранжирования функции были доступны.Адам Маханич приводит пример здесь , и на эту тему из Usenet есть полезные темы, такие как this .