2012-03-28 39 views
2

我試圖編寫一個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)/32.33...

+0

它看起來很複雜...你能張貼的所有表和所需的O/P – Teja 2012-03-28 14:01:02

+0

@Venk一些樣本數據:我提供了一個例子來消除混淆。 – 2012-03-28 14:07:30

+0

1 + 2 + 4是每個用戶乘坐的不同_lines_的數量。用戶1在1條線上行進,用戶2在2條線上行進,並且用戶3在4條線上行進。 – 2012-03-28 14:15:40

回答

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

這工作,有一點調整。非常感謝! – 2012-03-28 14:58:32