Попробуйте следующим образом:
select h.housecode
, hh.name
, pergroup + (perguest * GREATEST((2 - guests_included),0)) as mincalculated
-- select any column from a (availabilitydata)
from housedata h
inner join availabilitydata a on a.housecode = h.housecode
where (a.housecode, a.arrival, a.departure) = (
select a2.housecode, a2.arrival, a2.departure
from availabilitydata a2
where a2.housecode = h.housecode
and datediff(a2.departure, a2.arrival) = 7
order by a2.pergroup + (a2.perguest * GREATEST((2 - a2.guests_included),0)) asc
limit 1
)
В коррелированном подзапросе вы получите первичный ключ (a.housecode, a.arrival, a.departure
) строки с минимальным вычисленным значением.Во внешнем запросе вы выбираете только строку из availabilitydata
с тем же первичным ключом.
Обратите внимание, что если две строки имеют одинаковое вычисленное минимальное значение, вы получите обе из них.Если вам не нужны оба, вы должны определить, какой из них вы хотите в предложении ORDER BY (например, добавив полный первичный ключ):
order by a2.pergroup + (a2.perguest * GREATEST((2 - a2.guests_included),0)) asc
, a2.arrival
, a2.departure
Обновление
Приведенное выше решение неКажется, не очень хорошо.Но если ваша версия поддерживает оконные функции, вы также можете использовать следующий запрос:
select *
from (
select housedata.housecode
, housedata.name
, pergroup + (perguest * GREATEST((2 - guests_included),0)) as mincalculated
, row_number() over (
partition by housedata.housecode
order by pergroup + (perguest * GREATEST((2 - guests_included),0)) asc
) rn
, availabilitydata.arrival
-- select any other column from availabilitydata
from housedata
inner join availabilitydata on housedata.housecode = availabilitydata.housecode
where datediff(departure, arrival) = 7
) x
where rn = 1