Как выбрать подсчет отдельных (уникальных дальнобойщиков) без группы по функциям и, возможно, без использования наличия (не уверен в последнем) - PullRequest
0 голосов
/ 05 августа 2020

У меня есть задача, но я не могу ее решить:

Есть дальнобойщики и им приходится ездить между городами. У нас есть данные об этих поездках в нашей базе данных в 2 таблицах:

  1. trucker_traffi c

     tt_id (key)                
     date                
     starting_point_coordinate                
     destination_coordinate                
     traveller_id                
     event_type ('travel', 'accident')                
     parent_event_id (For 'accident' event type it's tt_id of the original travel. There might be few accidents within one travel.)             
    
  2. trucker_places

     coordinate (key)                
     country                
     city                
    

Мне нужен запрос SQL, чтобы получить количество всех уникальных дальнобойщиков, которые более одного раза ездили из или в Лондон в июне 2020 года. В том же запросе вытащите количество этих поездок, которые попали в аварию.

Пример моих попыток

SELECT
    count(distinct(tt.traveller_id)),
        
FROM trucker_traffic tt

JOIN trucker_places tp
    ON tt.starting_point_coordinate = tp.coordinate
     OR tt.destination_coordinate   = tp.coordinate
WHERE 
    tp.city = 'London'
    AND month(tt.date) = 6
    AND year(tt.date) = 2020
    
GROUP BY tt.traveller_id

HAVING count(tt.tt_id) > 1

Но он выбирает количество отдельных дальнобойщиков с группировкой и работает, только если у меня был один трекер в БД

Для второй части задачи (где я выбрал количество поездок с аварией - я думаю, что хорошо использовать такую ​​функцию

SUM(if(count(tt_id = parent_event_id),1,0))

Но я не уверен

1 Ответ

1 голос
/ 05 августа 2020

Это довольно сложно, поэтому убедитесь, что вы делаете это шаг за шагом. В этом помогут пункты WITH.

Шаги

  1. Найдите поездки из Лондона и в Лондон в июне 2020 года. Вы можете использовать IN или EXISTS, чтобы узнать,
  2. Группируйте путешествия по Лондону по путешественникам, учитывайте поездки и поездки в результате несчастных случаев и оставляйте только тех путешественников, которые совершили более одного путешествия.
  3. Возьмите этот набор результатов, чтобы подсчитать путешественников и подвести итог

Запрос

with london_travels as
(
  select 
    traveller_id,
    case when tt_id in
      (select parent_event_id from trucker_traffic where event_type = 'accident')
    then 1 else 0 end as accident
  from trucker_traffic tt
  where event_type = 'travel'
  and month(tt.date) = 6
  and year(tt.date) = 2020
  and exists
  (
    select 
    from trucker_places tp
    where tp.coordinate in (tt.starting_point_coordinate, tt.destination_coordinate)
    and tp.city = 'London'
  )
)
, london_travellers as
(
  select 
    traveller_id,
    count(*) as travels,
    sum(accident) as accident_travels
  from london_travels
  group by traveller_id
  having count(*) > 1;
)
select
  count(*) as total_travellers,
  sum(travels) as total_travels,
  sum(accident_travels) as total_accident_travels
from london_travellers;

Если ваша версия MySQL не поддерживает предложения WITH, вы, конечно, можете просто вложить запросы. Т.е.

with a as (...), b as (... from a) select * from b;

становится

select * from (... from (...) a) b;

Вы говорите в заголовке запроса, что не хотите GROUP BY в запросе. Это возможно, но усложняет запрос. Если вы хотите это сделать, я оставляю это вам как задачу. Подсказка: вы можете выбрать путешественников и посчитать их в подзапросах на каждого путешественника.

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