Что из людей, которые ехали хотя бы на одну поездку, какое среднее количество линий метро они проехали? - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь написать запрос SQL или ActiveRecord, чтобы ответить на этот вопрос: «Из людей, которые прошли хотя бы одну поездку, каково среднее число линий метро, ​​из которых они отбыли?»

Схема выглядит следующим образом:

  • Поездка: Поездка из одного места в другое.user_id для пользователя, location_id для местоположения.
  • Местоположение: Местоположение - это остановка вдоль линии.Местоположение имеет line_id, указывающее, на какой линии оно находится.Местоположение принадлежит одной линии.
  • Линия: Линия представляет собой серию связанных остановок метро, ​​ее местоположений.
  • Пользователь: Человеккоторый совершил поездку.

Похоже, мне нужно сделать две вещи:

  • Учитывая, что Поездки соединены с их местоположениями, подсчитайте количество различных комбинаций [rides.user_id, locations.line_id].
  • Разделите это число на количество пользователей, совершивших хотя бы одну поездку.

Результатом будет среднее значение и, следовательно, ответ на вопрос.

  1. Это звучит правильно?
  2. Если так, как лучше это сделать?

Я использую Rails, так что если я могувыразить это в синтаксисе ARel или AR, не обращаясь к SQL, это было бы здорово.Но я возьму то, что смогу получить.


Комментатор попросил привести пример.Давайте представим, что данные выглядят примерно так:

rides                     locations
======================    =====================
user_id    location_id    location_id   line_id
1          1              1             1
1          1              2             1
1          1              3             2
1          1              4             3
2          1              5             4
2          2              6             5
2          3
3          3
3          4
3          5
3          6

Мы видим, что пользователь 1 совершил 4 поездки, пользователь 2 - 3 поездки, а пользователь 3 - 4 поездки.Эти поездки были в [1, 3, 4] различных местах , но только [1, 2, 4] различных линий .Таким образом, среднее число строк, на которое проехался данный пользователь, составило (1 + 2 + 4) / 3 или 2.33....

1 Ответ

1 голос
/ 28 марта 2012

SQL:

select avg(ln) as avg_lines
from (
    select user_id, count(distinct line_id) as ln
    from rides r join locations l on (r.location_id = l.location_id)
    group by user_id
)
...