#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть таблица с именем combination_table. Сначала мне нужно найти travel_time average
. И с этим средним значением мне нужно сегментировать идентификаторы select
, которые выше среднего, которое мы вычисляем. Возможно ли написать такой запрос?
Комментарии:
1. Какие результаты вы хотите? Каждый
segment_id
из них имеет несколько строк, поэтому неясно, каковы желаемые результаты.2. В качестве запроса мне нужно найти сегменты, если их время перемещения выше среднего. Затем в части выбора я собираюсь создать словарь, включающий эти сегменты и их время .
Ответ №1:
вычислите среднее:
select avg(travel_time)
from combination_table;
Используйте это как подзапрос:
select c1.segmentid
from combination_table c1
where c1.travel_time > (select avg(c2.travel_time)
from combination_table c2);
Комментарии:
1. в этом запросе, как я могу упорядочить вывод в соответствии со столбцом времени
2.
order by c1.travel_time
?
Ответ №2:
Хммм … я думаю, вам нужна агрегация и фильтрация:
select s.*
from (select segment_id, avg(travel_time) as avg_travel_time
from combination_table ct
group by segment_id
) s cross join
(select avg(travel_time) as avg_travel_time
from combination_table
) overall
where s.avg_travel_time > overall.avg_travel_time;
Это возвращает segment_id
s, среднее время прохождения которых больше общего среднего.
Примечание: эта логика также может быть реализована с использованием оконных функций, но я думаю, что эта формулировка ясна по замыслу.