Показывать среднее значение, только если комбинация присутствует x количество раз - PullRequest
1 голос
/ 04 мая 2020

У меня есть таблица (airfare_data), содержащая столбцы city1 (происхождение), city2 (место назначения), квартал, тариф. В данных записано много строк рейсов, часто между одними и теми же городами. Я пытаюсь найти среднюю стоимость проезда за квартал, исключая маршруты, которые не проходили во всех 4 кварталах.

У меня есть следующая команда:

select distinct city1, city2, quarter, round(avg(fare),0)AvgF  
FROM airfare_data  
GROUP BY 1,2,3  
ORDER BY 1,2,3;

Это дает следующие результаты

city1 city2 квартал AvgF
Олбани, Нью-Йорк Денвер, Колорадо 1 224
Олбани, Нью-Йорк Денвер, Колорадо 2 256
Олбани, Нью-Йорк Денвер, Колорадо 3 256
Олбани, Нью-Йорк Денвер , CO 4 255
Олбани, Нью-Йорк Форт-Майерс, Флорида 1 200

Поскольку комбинация Олбани, Нью-Йорк и Форт-Майерс, Флорида встречается только в первом квартале, я бы хотел исключить его из своей таблицы, но Я не знаю как. Исходная таблица включает несколько строк комбинаций Олбани, Нью-Йорк и Форт-Майерс, Флорида, поэтому просто хочу показать, где любая комбинация присутствует во всех 4 Q.

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Использовать COUNT() оконную функцию:

SELECT city1, city2, quarter, AvgF
FROM (
  SELECT city1, city2, quarter, 
         ROUND(AVG(fare), 0) AvgF,
         COUNT(*) OVER (PARTITION BY city1, city2) counter
  FROM airfare_data  
  GROUP BY city1, city2, quarter
) t
WHERE t.counter = 4
ORDER BY city1, city2, quarter
0 голосов
/ 04 мая 2020

Используйте предложение having:

SELECT city1, city2, quarter, round(avg(fare),0) as AvgF  
FROM airfare_data  
GROUP BY 1,2,3 
HAVING COUNT(*) > 1 
ORDER BY 1,2,3;

SELECT DISTINCT очень, очень, очень редко используется с GROUP BY.

EDIT:

Для вашего измененного вопроса:

HAVING COUNT(DISTINCT quarter) > 1

или:

HAVING MIN (четверть) <> MAX (четверть)

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