Найти максимум (ы) в каждой группе - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть таблица с информацией о рейсах между городами, которая выглядит следующим образом:

origin_city dest_city   time    
Dothan AL   Atlanta GA    171       
Dothan AL   Elsewhere AL    2      
Boston MA   New York NY     5    
Boston MA   City MA         5    
New York NY Boston MA       5        
New York NY Poughkipsie NY  2

Я хочу вернуть для каждого города-источника максимальное время полета, а также город или города назначения, к которым относятсяЭто.Таким образом, результаты будут выглядеть следующим образом:

Dothan AL    Atlanta GA    171
Boston MA    New York NY   5
Boston MA    City MA       5
New York NY  Boston MA     5

На основании других потоков, например Причина столбца недопустима в списке выбора, поскольку она не содержится ни в статистической функции, ни в предложении GROUP BY, я написал запрос, который возвращает максимальное время полета из каждого города происхождения:

SELECT DISTINCT   F.origin_city AS origin_city, Max(F.actual_time) AS actual_time
FROM     Flights AS F
GROUP BY F.origin_city
ORDER BY F.origin_city

Но я получаю различные ошибки, когда пытаюсь включить пункт (ы), соответствующие этому времени.Например:

SELECT DISTINCT   F.origin_city AS origin_city, Max(F.actual_time) AS actual_time, F.dest_city AS dest_city
FROM     Flights AS F
GROUP BY F.origin_city
HAVING
    (MAX(F.actual_time) = F.actual_time)
ORDER BY F.origin_city
GO

... выдает мне сообщение об ошибке «Столбец« Tickets.actual_time »недопустим в предложении HAVING, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY».Я попытался добавить F.actual_time в группу, но затем я получил тонны результатов, потому что я получил максимальное время полета для каждой пары отправления / назначения (я думаю).Кроме того, поле actual_time должно содержаться в статистической функции: Макс.

Этот код:

SELECT F.origin_city AS origin_city, Max(F.actual_time) AS actual_time, F.dest_city AS dest_city
FROM Flights as F
WHERE F.actual_time IN (SELECT MAX(actual_time) FROM Flights AS F2 GROUP BY F2.origin_city) 
GROUP BY F.origin_city

выдает аналогичную ошибку: столбец «Tickets.dest_city» недопустим в списке выборапотому что он не содержится ни в статистической функции, ни в предложении GROUP BY.

Как правильно вернуть все 3 столбца?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете присоединить запрос, который у вас уже есть, к таблице Flights, соответствующей столбцу origin_city и actual_time от Flights до max_actual_time из запроса:

SELECT F.*   
FROM Flights AS F INNER JOIN (
SELECT 
  origin_city, 
  Max(actual_time) AS max_actual_time
FROM Flights
GROUP BY origin_city) AS T
ON T.origin_city = F.origin_city AND T.max_actual_time = F.actual_time
ORDER BY F.origin_city
0 голосов
/ 04 февраля 2019

Вы хотите RANK():

SELECT F.*
FROM (SELECT F.*,
             RANK() OVER (PARTITION BY origin_city ORDER BY time DESC) AS SEQ
      FROM Flights AS F
     ) F
WHERE SEQ = 1;

Если я пойду с вашей версией, тогда я сделаю:

SELECT F.*
FROM Flights as F
WHERE F.actual_time = (SELECT MAX(F2.actual_time) 
                       FROM Flights AS F2 
                       WHERE F2.origin_city = F.origin_city
                      ); 

Ваш GROUP BY действительно не нужен для обоих outer & subquery, просто передайте outer query ссылку (F.origin_city) в subquery (F2.origin_city), чтобы сделать его коррелированным подзапросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...