Функция подсчета в Oracle - PullRequest
0 голосов
/ 10 июня 2010

Вопрос, с которым я борюсь, заключается в следующем:

У меня есть список названий вертолетов в разных чартерах, и мне нужно выяснить, КАКОЙ вертолет имеет наименьшее количество забронированных чартеров.Как только я узнаю это, мне нужно ТОЛЬКО отобразить ту, которая имеет наименьшее количество.

У меня пока есть это:

SELECT Helicopter_Name 
       , COUNT (Distinct Charter_NUM)
FROM Charter_Table
GROUP BY Helicopter Name

Вот где я застрял.Я понимаю, что MIN можно использовать для выбора наименьшего значения, но я не уверен, как интегрировать это в команду.

Что-то вроде Where MIN = MIN Value

Я бы очень признателенэто.

Ответы [ 4 ]

1 голос
/ 10 июня 2010

Вот решение, которое просто занимает первую строку после упорядочивания их от наименьшего счета к наибольшему:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Charter_Count) AS RN
    FROM (
        SELECT Helicopter_Name, COUNT(Distinct Charter_NUM) Charter_Count
        FROM Charter_Table GROUP BY Helicopter_Name
    ) AS t1
) AS t2
WHERE t2.RN = 1;

Вот решение, которое использует HAVING для сравнения счетчика данной группы с самым низкимрассчитывать с учетом всех групп.На основе ответа, данного @Gary, но добавив еще один уровень подзапроса.

SELECT Helicopter_Name, COUNT(Distinct Charter_NUM) AS Charter_Count
FROM Charter_Table 
GROUP BY Helicopter_Name
HAVING COUNT(Distinct Charter_NUM) = (SELECT MIN(C) FROM
    (SELECT COUNT(Distinct Charter_NUM) AS C
     FROM Charter_Table 
     GROUP BY Helicopter_Name))
1 голос
/ 10 июня 2010

Одна вещь, которую вам нужно учитывать, это то, что произойдет, если два или более вертолета забронировали наименьшее количество чартеров?

Если вы просто хотите «выбрать один», вы можете просто отсортировать по количеству (по убыванию) и сообщите первый результат:

SELECT * FROM (
   SELECT Helicopter_Name, c FROM (
      SELECT Helicopter_Name, COUNT (Distinct Charter_NUM) AS c
      FROM Charter_Table GROUP BY Helicopter 
   ) ORDER BY c DESC
) WHERE ROWNUM = 1;

В качестве альтернативы, если вам необходимо сообщить все helis, которые имеют наименьшее количество чартеров с учетом связей, вы можете использовать аналитическую функцию RANK:

SELECT Helicopter_Name, c FROM (
   SELECT Helicopter_Name, c, RANK() OVER (ORDER BY c) therank FROM (
      SELECT Helicopter_Name, COUNT (Distinct Charter_NUM) AS c
      FROM Charter_Table GROUP BY Helicopter 
   )
) WHERE therank = 1;
0 голосов
/ 10 июня 2010

Это простой ответ.

SELECT Helicopter_Name
FROM Charter_Table 
GROUP BY Helicopter_Name
HAVING COUNT (Distinct Charter_NUM) = 
   (SELECT MIN(COUNT (Distinct Charter_NUM)) CNT
   FROM Charter_Table 
   GROUP BY Helicopter_Name)
0 голосов
/ 10 июня 2010

О, просто подумал о чем-то, могу ли я добавить это:

(например, просто скажем, что у 10 чартеров и вертолета RED было меньше всего)

SELECT Helicopter_Name COUNT (Distinct Charter_NUM) FROM Charter_Table GROUPПо названию вертолета ИМЕЕТ Итого = МИН

Будет ли это указывать на стоимость вертолета RED?

...