Таблица ключей будет:
trip (trip_id, passenger_id, start_location_id, end_location_id)
Возможно, у вас есть таблица местоположений с информацией об остановках.
Тогда запрос будет просто
select start_location_id, end_location_id, count(*)
from trip
group by start_location_id, end_location_id
having count(*)>=2
Редактировать
За комментарий ниже, может быть, я неправильно понимаю требование. Вы пытаетесь найти ПОЕЗДКИ, в которых более 2 пассажиров, или МЕСТА, в которых более 2 пассажиров, или что? То есть, если у нас есть поездки (Al, L1, L2), (Бетти, L1, L2), (Карл, L1, L3), (Донна, L2, L4), если результат будет:
L1, L2, 2
(и это все)?
Или это должно быть
L1, 3
L2, 3
Полагаю, мой запрос выше даст первый результат. Если вы ищете второй результат, он будет:
select location, sum(visits)
from
(
select start_location_id as location, count(*) as visits
from trip
union
select end_location_id as location, count(*) as visits
from trip
)
group by location
having sum(visits)>=2
order by location
Поскольку вы складываете счетчики для двух разных столбцов, я не вижу способа избежать использования объединения и внутреннего запроса.
Возможно, другая схема сделает этот запрос намного проще, а именно, вместо trip есть trip_stop:
trip_stop (идентификатор пассажира, идентификатор местоположения, номер остановки)
где stop_number, скажем, 1 для начального местоположения и 2 для конечного местоположения.
Теперь, когда я думаю об этом, это действительно лучше, так как устраняется необходимость иметь два поля, представляющих одну и ту же идею, а также упрощается расширение до поездок с несколькими остановками.
Тогда запрос просто становится
select location_id, count(*)
from trip_stop
group by location_id
having count(*)>=2
order by location_id