Запрос, чтобы увидеть значение MAX в Oracle - PullRequest
0 голосов
/ 14 марта 2020

В моей базе данных Oracle (речь идет об аэропорте) у меня есть следующая таблица N: N (где хранятся посадки людей):

CREATE TABLE boardings(
Passport VARCHAR2(8),
Day DATE,
Flight VARCHAR2(8),
LuggageWeight NUMBER(4,2),
CONSTRAINT pk PRIMARY KEY(Passport, Day, Flight));

И я хотел бы сделать запрос в Для каждого рейса, который был днем ​​перевозки самого большого веса, нужно было посмотреть (имейте в виду, что один и тот же рейс, как, например, RY-1234-VY, может совершать разные путешествия в разные дни. Я пытался как то так, но это не работает:

SELECT Day, Flight
FROM test
GROUP BY Day, Flight
HAVING SUM(LuggageWeight) = (SELECT MAX(SUM(LuggageWeight))
                             FROM test
                             GROUP BY Day, Flight);

Ответы [ 4 ]

2 голосов
/ 14 марта 2020

Есть несколько способов подойти к этому.

Вы можете запустить агрегирование один раз в общем табличном выражении и использовать его в подзапросе.

with totals as (
  SELECT Day, Flight, SUM(LuggageWeight) total_weight
  FROM test
  GROUP BY Day, Flight
)
select *
from totals
where total_weight = (select max(total_weight) from totals);

Или объединить группирование с оконными функциями:

select day, flight, total_weight
from (
  SELECT Day, Flight, 
         SUM(LuggageWeight) total_weight,
         dense_rank() over (order by SUM(LuggageWeight) desc) as rnk
  FROM test
  GROUP BY Day, Flight
) totals
where rnk = 1;

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

И если вас интересует только одна строка, даже если существует несколько комбинаций день / полет с тот же (максимальный) общий вес, который вы можете использовать:

SELECT Day, Flight, SUM(LuggageWeight) total_weight
FROM test
GROUP BY Day, Flight
order by SUM(LuggageWeight) desc
fetch first 1 rows only;

Опять же: вышеупомянутое не совсем то же самое, что и другие решения, но может быть достаточно хорошим.

1 голос
/ 14 марта 2020

И я хотел бы сделать запрос, чтобы увидеть для каждого рейса, который был днем, когда перевозится наибольшее количество веса (имейте в виду, что тот же рейс, что и RY-1234-VY например, может совершать разные поездки в разные дни.

В одном решении используются оконные функции:

SELECT b.*
FROM (SELECT Day, Flight, SUM(LuggageWeight) as TotalWeight,
             RANK() OVER (PARTITION BY Flight ORDER BY SUM(LuggageWeight) DESC) a seqnum
      FROM boardings b
      GROUP BY Day, Flight
     ) b
WHERE seqnum = 1 

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

SELECT Flight, MAX(TotalWeight),
       MAX(Day) KEEP (DENSE_RANK FIRST ORDER BY TotalWeight DESC) as Day
FROM (SELECT Day, Flight, SUM(LuggageWeight) as TotalWeight,
             RANK() OVER (PARTITION BY Flight ORDER BY SUM(LuggageWeight) DESC) a seqnum
      FROM boardings b
      GROUP BY Day, Flight
     ) b
GROUP BY flight;
1 голос
/ 14 марта 2020

Я думаю, вы были близки.

SELECT Day, Flight
FROM boardings b1
GROUP BY Day, Flight
HAVING SUM(LuggageWeight) = (SELECT MAX(SUM(LuggageWeight))
                             FROM boardings b2
                             where b1.Flight = b2.Flight -- I have added this line
                             GROUP BY day, flight);

Вот демоверсия

Как-то так? :

SELECT Flight, Day
FROM boardings b1
where (Flight, Day) = (SELECT Flight, Day
                     FROM boardings b2
                     where b2.flight = b1.flight
                     GROUP BY Flight, Day
                     order by SUM(LuggageWeight) desc
                     fetch first 1 rows only)
1 голос
/ 14 марта 2020

Я бы разбил эту проблему на два умственных шага. Во-первых, вам необходимо суммировать вес за рейс в день, что можно сделать, позвонив по номеру sum в запросе, сгруппированном по дате полета и рейсу. Затем для каждого рейса вам нужно найти самый верхний день, что можно сделать с помощью оконной функции rank:

SELECT day, flight, sum_weight
FROM   (SELECT day, flight, sum_weight,
               RANK() OVER (PARTITION BY flight ORDER BY sum_weight DESC) AS rk
        FROM   (SELECT   day, flight, SUM(LuggageWeight) AS sum_weight
                FROM     boardings
                GROUP BY day, flight) t1
       ) t2
WHERE  rk = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...