Запрос с помощью запроса - PullRequest
0 голосов
/ 10 ноября 2018

Создайте список пилотов, которые имеют наибольшее количество летных часов для каждой модели самолета. Включите столбцы для pid, модели и часов.

Это то, что я пробовал - я очень плохо знаком с SQL:

select
    pid, hourslogged 
from 
    flightskills f
join    
   (select 
        model, max(hourslogged) as Hourslogged 
    from 
        flightskills
    group by 
        model) h on f.model = h.model

это неправильный вывод

PID MODEL   HOURSLOGGED
1   A-10        387
4   A-10        387
6   A-10        387
7   A-10        387
3   F-117A  254
4   F-117A  254
5   F-117A  254
6   F-117A  254
1   F-15E   450
2   F-15E   450
3   F-15E   450
4   F-15E   450
6   F-15E   450
1   F-16    827
6   F-16        827
1   F-22        900
3   F-22        900
4   F-22        900
5   F-22        900
6   F-22        900
6   X-100   100

Хочешь что-то подобное

PID MODEL   HOURSLOGGED
1   A-10        387
3   F-117A  254
4   F-15E   450
1   F-16    827
3   F-22        900
6   X-100   100

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

По вашему запросу

select pid, hourslogged 
  from flightskills f
  join    
     (select model, max( hourslogged) as Hourslogged 
        from flightskills
       group by model) h    
    on f.model = h.model

есть два PID столбца и два HOURSLOGGED столбца, доступных при компиляции запроса, f.PID и h.PID, f.HOURSLOGGED и h.HOURSLOGGED. В списке SELECT вы должны указать базе данных, какой из столбцов вы хотите использовать. Чтобы решить эту проблему, вы можете изменить свой запрос на

select f.pid, h.hourslogged 
  from flightskills f
  join    
     (select model, max( hourslogged) as Hourslogged 
        from flightskills
       group by model) h    
    on f.model = h.model

dbfiddle здесь

Желаем удачи в оставшейся части вашего задания.

0 голосов
/ 12 ноября 2018

Вам даже не нужно идти на вложенный запрос. Поскольку вы используете Oracle, вы можете использовать Аналитические функции . Ну, немного подзапроса все еще необходимо, так как аналитическая функция не переходит непосредственно в условие WHERE (она запускается после условия where, которое оценивается).

SELECT
  pid, 
  model, 
  hourslogged, 
FROM (
SELECT
  pid, 
  model, 
  hourslogged, 
  ROW_NUMBER() OVER (PARTITION BY model ORDER BY hourslogged DESC) AS rn
FROM flightskills
) WHERE rn = 1

Вы можете использовать различные методологии ранжирования вместо простых ROW_NUMBER. Например, DENSE_RANK будет обрабатывать ситуацию, когда два пилота будут регистрировать одинаковое количество часов по-разному (они будут показывать оба, а не случайно один из двух).

Вышеописанный подход идет сразу после верхней записи hourslogged для каждой модели. Вы делаете это в два шага 1. / Ранг 2. / Выберите верхний ранг (rn = 1).

0 голосов
/ 10 ноября 2018

Я думаю, вы ищете что-то вроде этого:

select f.*
from flightskills f
where f.hourslogged = (select max(f2.hourslogged) 
                       from flightskills f2
                       where f2.model = f.model
                      );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...