2012-03-28 6 views
2

私はこの質問に答えるためにSQLまたはActiveRecordのクエリを書こうとしています: "少なくとも1台の乗り物を持っていた人のうち、彼らが出発したメトロラインの平均数は何ですか?"少なくとも1台の乗車をした人のうち、彼らが乗ったメトロ線の平均数はいくらですか?

  • ライド:一つの場所から別の旅行を次のように

    スキーマです。ユーザーの場合はuser_id、場所の場合はlocation_idです。

  • 場所:場所は、行に沿った停止です。場所には、それがどの行にあるのかを示すline_idがあります。場所は1行に属します。
  • ライン:ラインは、一連の関連する地下鉄の停留所、その場所です。
  • ユーザー:旅行をした人。

私は二つのことを行う必要があるように見えます:明確な[rides.user_id, locations.line_id]組み合わせの数をカウントし、その場所に接合された乗り物を考える

  • を。
  • 少なくとも1回乗ったユーザーの数で割ってください。

結果は平均であり、したがって質問に対する回答になります。

  1. 正しいですか?
  2. もしそうなら、それを行う最良の方法は何ですか?

私はRailsを使用していますので、SQLにドロップしなくてもARelまたはAR構文でこれを表すことができます。しかし、私が得ることを取るつもりです。


コメント者は例を求めました。データが次のようになりますことを想像してみましょう:

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...でした。

+0

それは複雑に見えます...あなたはすべてのテーブルと希望O/P – Teja

+0

@Venkためのいくつかのサンプルデータを投稿することができます:私は、任意の混乱を解消するための例を提供します。 –

+0

1 + 2 + 4は、各ユーザーから乗っていた別個の_lines_の数です。ユーザー1は1行に、ユーザー2は2行に、ユーザー3は4行に移動しました。 –

答えて

1

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 
) 
+0

これはちょっと微調整していました。どうもありがとう! –

関連する問題