【发布时间】:2012-03-28 13:57:36
【问题描述】:
我正在尝试编写 SQL 或 ActiveRecord 查询来回答以下问题:“在至少乘坐过一次车的人中,他们离开的地铁线路平均数量是多少?”
架构如下:
-
骑行:从一个地点到另一个地点的旅行。
user_id代表用户,location_id代表位置。 -
位置:位置是沿线的停靠点。该位置有一个
line_id,表示它在哪一行。一个位置属于一条线。 - 线路:线路是一系列相关的地铁站及其位置。
- 用户:参加这次旅行的人。
看来我需要做两件事:
- 鉴于 Rides 加入了他们的位置,计算不同的
[rides.user_id, locations.line_id]组合的数量。 - 除以至少乘坐过一次的用户数量。
结果将是平均值,因此是问题的答案。
- 听起来对吗?
- 如果是这样,最好的方法是什么?
我正在使用 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...。
【问题讨论】:
-
看起来很复杂...你能发布一些所有表的示例数据和所需的o/p
-
@Venk:我提供了一个示例来消除任何混淆。
-
1 + 2 + 4 是每个用户乘坐的不同行的数量。用户 1 乘坐了 1 条线路,用户 2 乘坐了 2 条线路,用户 3 乘坐了 4 条线路。
-
如果我错了请纠正我.. line 你的意思是说与用户旅行的位置相对应的行列值对吗?用户 1 仅在位置 1 上行驶 .. 使用的线路是 line_id 1。用户 2 在 1,2,3 位置上行驶意味着使用的 line_id 是 1,1,2 - 到目前为止不同的 line_id [1,2] .. 用户在 location_id 上行驶[3,4,5,6] line_id used [2,3,4,5] then distinct line_id used should be [1,2,3,4,5] .. right .. 除法计数应为 5 ..不是吗?
-
@pratikgarg 不,应该是 7。用户 1 骑了 1 条线路。用户 2 骑了 2 条线路。用户 3 骑了 4 条线路。 1 + 2 + 4 是 7,而不是 5。请记住,我们正在尝试计算 每位用户的平均行数。
标签: sql activerecord count distinct