Sql 使用GROUPBY子句选择最早的HABTM记录

Sql 使用GROUPBY子句选择最早的HABTM记录,sql,ruby-on-rails,postgresql,activerecord,ruby-on-rails-5,Sql,Ruby On Rails,Postgresql,Activerecord,Ruby On Rails 5,我想在管理页面上显示一个折线图,其中包含与最早导出日期相关的分数增量 我有以下型号: # score.rb class Score < ApplicationRecord has_and_belongs_to_many :export_orders, join_table: :scores_export_orders end # export_order.rb class ExportOrder < ApplicationRecord has_and_belongs_t

我想在管理页面上显示一个折线图,其中包含与最早导出日期相关的分数增量

我有以下型号:

# score.rb

class Score < ApplicationRecord
  has_and_belongs_to_many :export_orders, join_table: :scores_export_orders
end

# export_order.rb

class ExportOrder < ApplicationRecord
  has_and_belongs_to_many :scores, join_table: :scores_export_orders
end
但总分数比所有有出口日期的分数都多。 有什么想法吗?

试试:

class Score < ApplicationRecord
  has_and_belongs_to_many :export_orders, join_table: :scores_export_orders

  def earliest_export_date
    export_orders.pluck(&:created_at).min
  end
end
班级分数
这将允许您调用
@score.earlish\u export\u date
,它将返回您想要的值


我还认为这是在ruby中实现这一点的最有效的方法,尽管有人可能会纠正我的错误。

由于它依赖于纯SQL,因此下面的方法的性能要好于其他方法。基本上,GROUP BY子句要求按
scores\u export\u orders.scores\u id
而不是
export\u orders进行分组。在
处创建:

sql = "
SELECT
  COUNT(DISTINCT scores_export_orders.score_id), MIN(export_orders.created_at::date)
INNER JOIN
  scores_export_orders
INNER JOIN
  export_orders
ON
  export_orders.id = scores_export_orders.export_order_id
GROUP BY
  scores_export_orders.score_id
".split("\n").join(' ')
query = ActiveRecord::Base.connection.execute(sql)
query.map { |v| [v['count'], v['min']] }

我在ActiveRecord指令中找不到完全等效的指令(所有这些尝试都给了我奇怪的结果),因此执行SQL也可以做到这一点。

要收集所有日期,我可以对所有分数运行
map
,然后使用您的方法。这可能导致约1500个分数条目延迟约10秒。有更好的方法吗?
sql = "
SELECT
  COUNT(DISTINCT scores_export_orders.score_id), MIN(export_orders.created_at::date)
INNER JOIN
  scores_export_orders
INNER JOIN
  export_orders
ON
  export_orders.id = scores_export_orders.export_order_id
GROUP BY
  scores_export_orders.score_id
".split("\n").join(' ')
query = ActiveRecord::Base.connection.execute(sql)
query.map { |v| [v['count'], v['min']] }