Ruby on rails 如何从多个月中获取第一条记录

Ruby on rails 如何从多个月中获取第一条记录,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个就业表,记录员工每月的就业情况和积分 我正在努力找出如何让员工在每个月的第一名完成工作 我试过这样的东西 create_table "placements", :force => true do |t| t.integer "employee_id" t.date "month" t.integer "points" end @previous_winners = @placements.includes(:employee).order('points DES

我有一个就业表,记录员工每月的就业情况和积分

我正在努力找出如何让员工在每个月的第一名完成工作

我试过这样的东西

create_table "placements", :force => true do |t|
 t.integer  "employee_id"
 t.date     "month"
 t.integer  "points"
end

@previous_winners = @placements.includes(:employee).order('points DESC').first

我想我可能需要循环使用所有月份?

你可以使用类似的方法来获取上一个月的数据

from = Time.now.beginning_of_month - 1.month
to = from.end_of_month
然后可以将它们添加到查询中

@previous_winners = @placements.includes(:employee).where('month BETWEEN ? AND ?', from, to).order('points DESC').first

您可以使用
group
按月份对最高分进行分组。像这样的方法应该会奏效:

@previous_winners = @placements.includes(:employee).group(:month).
  order('points DESC').map(&:employee)
此查询返回每月点数最高的职位,包括关联的员工,然后map函数返回每个记录的员工

这个答案的前提是每个月的就业记录都有完全相同的日期

[编辑]

这个答案在postgres上根本不起作用,我认为它在MySQL上根本不会返回正确的结果!这是一个稍微笨拙的版本,应该可以运行(但每个月都会运行一个DB查询)


如果有人想玩弄它,那么SQL是否会玩弄问题中描述的模式

PostgreSQL中的“分组依据”与MySQL中的工作方式稍有不同。您需要的是rails/ruby与以下SQL表达式等效:

SELECT DISTINCT ON (month) month,points, employee_id
FROM placements
order by month, points DESC
在rails controller中,您可以使用以下方法获得上述信息:

@placements.select('DISTINCT ON (month) month, points, employee_id').where('YOUR_CONDITION').order('month, points DESC')
这只是一个关于如何在PostgreSQL中分组的示例,以满足您的需要


这里的诀窍是:)

第一名的意思是什么?对不起,我让“月数说明”订购了它,而它本应该是“点数说明”。因此,第一位将是具有最多点(0..11)的记录{| sum,m | sum这看起来是对的。不过我得到了一个postgresql group_的错误。我没有把它包括在问题中,所以当我找出错误时,我会标记正确,看看它是否有效。我会添加。首先到语句的末尾?这只会给你第一个月的获胜者,那么我如何获得所有以前的获胜者?我正在使用Postgresql所以我得到了以下错误:PG::error:error:column“placements.id”必须出现在GROUPBY子句中或用于聚合函数行1:选择“placements”。*从“placements”内部连接“employee…”。。。
@placements.select('DISTINCT ON (month) month, points, employee_id').where('YOUR_CONDITION').order('month, points DESC')