【问题标题】:Of people who took at least one ride, what's the average number of metro lines they rode?在至少乘坐过一次的人中,他们乘坐的平均地铁线路数是多少?
【发布时间】:2012-03-28 13:57:36
【问题描述】:

我正在尝试编写 SQL 或 ActiveRecord 查询来回答以下问题:“在至少乘坐过一次车的人中,他们离开的地铁线路平均数量是多少?”

架构如下:

  • 骑行:从一个地点到另一个地点的旅行。 user_id 代表用户,location_id 代表位置。
  • 位置:位置是沿线的停靠点。该位置有一个line_id,表示它在哪一行。一个位置属于一条线。
  • 线路:线路是一系列相关的地铁站及其位置。
  • 用户:参加这次旅行的人。

看来我需要做两件事:

  • 鉴于 Rides 加入了他们的位置,计算不同的 [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...

【问题讨论】:

  • 看起来很复杂...你能发布一些所有表的示例数据和所需的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


【解决方案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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 2021-03-03
    • 2018-04-12
    • 2016-08-18
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多