2017-02-06 4 views
0

Так я работал в sqlite3, где следующие работы команды:Выбор столбцов в Postgres, не входящих в GROUP BY?

select origin_city, dest_city, actual_time 
FROM flights 
GROUP BY origin_city 
ORDER BY actual_time desc; 

но при попытке сделать это в PSQL, это не нравится, что dest_city и actual_time не в предложения GROUP BY. Я пытаюсь выбрать самый длинный рейс из каждого места происхождения и отображать начало, место назначения и время полета. Как я могу это решить?

+0

Если вы добавили их в группу или использовали функцию агрегата, такую ​​как max на них – GurV

+2

Что вы пытаетесь сделать? Заявление не имеет смысла. –

+0

@a_horse_with_no_name, выбирая самый длинный рейс из каждого места происхождения и показывающий начало, место назначения и время полета –

ответ

0

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

select origin_city, dest_city, actual_time 
from (
    select 
    t.*, 
    row_number() over (partition by origin_city order by actual_time desc) rn 
    from flights t 
) t where rn = 1; 
0

Вы можете использовать функцию ROW_NUMBER() для этого в КТР или подзапроса:

WITH cte as (SELECT * 
        ,ROW_NUMBER() OVER(PARTITION BY origin_city ORDER BY actual_time DESC) RN 
       FROM flights 
      ) 
SELECT origin_city, dest_city, actual_time 
FROM cte 
WHERE RN = 1 
ORDER BY actual_time DESC; 

ROW_NUMBER() функция присваивает номер каждой строки. PARTITION BY не является обязательным, но используется для начала нумерации для каждого значения в этой группе, то есть: если вы PARTITION BY origin_city, то для каждого уникального значения origin_city нумерация начнется с 1. ORDER BY, конечно, используется, чтобы определить, как должен идти счет, и требуется в функции ROW_NUMBER().

Многих баз данных не позволяют иметь не совокупное поле в списке SELECT это не также в пункте GROUP BY когда пункт GROUP BY присутствует, MySQL и SQLite допускают это, но он может вернуться к нежелательным результатам в определенном ситуации.

+0

Пример вашего исходного запроса, возвращающего нежелательные результаты, показан здесь: http://sqlfiddle.com/#!7/fe872/1/0 Обратите внимание, как он возвращает самое низкое значение для 'col3', даже если он упорядочивает это поле по убыванию, это ненадежно. –

0

Почему теперь создается временная таблица с максимальным фактическим временем для каждого origin_city?

SELECT temp.origin_city, flights.dest_city, temp.actual_time 
FROM (
    SELECT origin_city, MAX(actual_time) actual_time 
    FROM flights 
    GROUP BY origin_city 
) temp 
JOIN flights using (origin_city, actual_time) 
ORDER BY temp.actual_time DESC