SQL GROUP BY & VALUE - PullRequest
       1

SQL GROUP BY & VALUE

1 голос
/ 05 сентября 2011

у меня есть стол

AvailbilityDate |   Resort    |  AccomName  |  Price    |  Min Occupancy
24 June 2012    |    Resort1  |    Accom1   |     999   |    8
24 June 2012    |    Resort1  |    Accom2   |     888   |    6
24 June 2012    |    Resort2  |    Accom1a  |     243   |    10
24 June 2012    |    Resort2  |    Accom2a  |     563   |    7

Что у меня сейчас есть

SELECT AvailbilityDate, Resort, MIN(Price) AS Lowest 
FROM mytable 
GROUP BY AvailbilityDate, Resort

Я хочу иметь возможность получить AccomName и Min Occupancy

Большое спасибо заранее

Ответы [ 5 ]

1 голос
/ 05 сентября 2011

Используя обычные табличные выражения и функции ранжирования, вы можете сделать это

WITH cte as (
SELECT 
  ROW_NUMBER() over (PARTITION BY AvailabilityDate,Resort ORDER BY price) as row,
  AvailbilityDate,
  Resort,
  AccomName,
  Price,
  [Min Occupancy] 
FROM mytable  
)
SELECT AvailbilityDate,Resort,Price,AccomName,[Min Occupancy] from cte where row=1
1 голос
/ 05 сентября 2011

При использовании стандартного ANSI SQL решение будет таким:

SELECT *
FROM (
   SELECT AvailbilityDate, 
          resort,
          accomName,
          price,
          min_occupancy,
          min(price) over (partition by AvailbilityDate, Resort) as min_price
   FROM deals_panel_view
) t
WHERE min_price = price;

Должно работать на PostgreSQL, Oracle, DB2, SQL Server, Sybase и Terradata

0 голосов
/ 06 сентября 2011

Вы можете сделать это несколькими способами.

1) Ранжирование - согласно решению a_horse_with_no_name

2) Группировка по и перекрестное применение.По сути, подключите столбцы, которые вы хотите сгруппировать в первом подзапросе, а затем все остальные столбцы перейдите во второй подзапрос.Используйте Order By во втором подзапросе для обработки любого столбца, к которому вы хотите применить MIN (или MAX).

SELECT a.AvailbilityDate, 
       a.resort,
       b.AccomName,
       b.min_occupancy,
       b.Lowest
FROM 
(
 SELECT t1.AvailbilityDate, t1.resort
  FROM myTable t1
  GROUP BY t1.AvailbilityDate, t1.resort
 ) a
CROSS APPLY
( 
  SELECT TOP 1 t2.AccomName, t2.min_occupancy, t2.price as Lowest
      FROM mytable t2
         WHERE t2.AvailbilityDate = a.AvailbilityDate
          AND t2.resort = a.resort
          ORDER BY t2.price ASC
) b

3) Использовать подзапросы в операторе select (не очень элегантно, но работает) с Group By.Это предполагает, что существует только одно размещение с заданной минимальной ценой для каждой комбинации даты доступности и курорта.

SELECT a.AvailbilityDate, 
       a.resort,
       (SELECT accomName FROM myTable t1
         WHERE t1.AvailbilityDate = a.AvailbilityDate
          AND t1.resort = a.resort
          AND t1.price = MIN(a.price)
       ) as accomName,
       (SELECT min_occupancy FROM myTable t1
         WHERE t1.AvailbilityDate = a.AvailbilityDate
          AND t1.resort = a.resort
          AND t1.price = MIN(a.price)
       ) as min_occupancy,
       MIN(a.price) as Lowest
  FROM myTable a
  GROUP BY a.AvailbilityDate, a.resort
0 голосов
/ 05 сентября 2011

ВЫБРАТЬ Имя, МИН. ([Мин. Занятость]) КАК НАИМЕНОВАНИЕ ИЗ ГРУППОВОГО ГРУППА BYN:

Это даст ТОЛЬКО желаемую информацию.Если вы хотите, чтобы в ДОПОЛНЕНИИ были нужные поля к тому, что у вас уже есть, это будет выглядеть следующим образом:

ВЫБРАТЬ Доступность, Дата, Имя, Курорт, МИН. (Цена) КАК Минимально, Мин.ИЗ mytable GROUP BY ДоступностьДата, Размещение Имя, Курорт

0 голосов
/ 05 сентября 2011
SELECT AvailbilityDate, Resort, AccomName, "Min Occupancy", MIN(Price) AS Lowest 
FROM mytable 
GROUP BY AvailbilityDate, Resort
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...