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']] }