ВЫБЕРИТЕ идентификаторы сегментов, если они выше среднего

#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, среднее время прохождения которых больше общего среднего.

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