【问题标题】:The right SQL or ActiveRecord formulation正确的 SQL 或 ActiveRecord 公式
【发布时间】:2014-04-03 14:11:24
【问题描述】:

这是场景。我有一个名为sentiment_log 的数据库,它记录来自参加某个讲座的学生的实时“投票”,他们在特定时间投票表示他们“参与”或“困惑”。讲座被划分为由整数表示的时间段。架构如下所示:

student_id: int
sentiment_id: int
lecture_id: int
time_slot: int

rails 模型是 SentimentLog 我相信我想要的可以用一点聪明的 SQL 来完成,但我没有成功地制定它。我想要的是,给定一个 target_time_slot 和一个 target_lecture_id,结果集每个 student_id 都有一条记录,如下所示:

  • student_id
  • student_id 投票的最近时隙记录的sentiment_id

比如,

  • 选择带有lecture_id == target_lecture_idtime_slot <= target_time_slot 的记录子集
  • 从中选择一个记录子集,其中每个学生都由他们最近的(即最大的)time_slot 表示。

这应该会为每个 student_id 生成一条记录。

到目前为止我还没有成功。

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    您还没有告诉我们您的型号名称,所以我将其称为“Foo”。我还假设所有内容都在同一张表中。你不描述student_id,和user_id一样吗?

    @foos=Foo.where("lecture_id = ? AND time_slot <= ?",target_lecture_id, target_time_slot).maximum(:time_slot, group: :student_id)
    

    此语句将提供如下哈希:

    {4=>240, 5=>235, 2=>237, 1=>243, 3=>241} #{:student_id => max(:time_slot)}
    

    结果使用示例:

    @foos.each do |foo|
        puts foo[0] #... (student_id)
        puts foo[1] #... (max time_slot)
    end
    

    【讨论】:

    • 对不起,模型被称为 SentimentLog 和 student_id 应该是,user_id 是一个错字,我会更正。谢谢!我会试试看:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 2015-03-18
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多