我需要根据uniq Inspection_id过滤Home记录
Home.all.select(:id,:inspection_id)
[#<Home:0x007fc5cd065758 id: 2192, inspection_id: 21967>,
#<Home:0x007fc5cd065618 id: 2191, inspection_id: 21968>,
#<Home:0x007fc5cd0654d8 id: 2190, inspection_id: 21967>,
#<Home:0x007fc5cd065398 id: 2189, inspection_id: 21968>,
#<Home:0x007fc5cd065258 id: 2188, inspection_id: 21963>,
#<Home:0x007fc5cd065118 id: 2187, inspection_id: 21967>]
需要这样的结果
[#<Home:0x007fc5cd065758 id: 2192, inspection_id: 21967>,
#<Home:0x007fc5cd065618 id: 2191, inspection_id: 21968>,
#<Home:0x007fc5cd065118 id: 2188, inspection_id: 21963>]
Home with ids
2191,2191,2188
,我需要在结果集中
我尝试过这个,但不起作用。
Home.all.select(:id,:inspection_id).distinct
出现此错误
ORDER BY 子句的表达式 #1 不在 SELECT 列表中,引用列 'myDB.homes.created_at' 不在 SELECT 列表中;这与 DISTINCT 不兼容
接下来我可以尝试什么?
首先,我认为这不是一个有效的SQL语句。 DISTINCT 将作用于 SELECT 子句中定义的所有列,并将返回所有记录,因为所有记录的 ID 都不同。更好的选择是 GROUP。
Home.all.select(:id, :inspection_id).group(:inspection_id)
这将按 Inspection_ids 对所有记录进行分组,如果您在上述查询中调用 to_a
- 您将仅获得有效记录。您还可以迭代上面的记录。
另一个选择是,如果您不期望有很多行 - 只需使用
Home.all.pluck(:id, :inspection_id)
并在 Rails 端执行独特的逻辑 - 但如果您有成千上万行,这不是一个好的解决方案 - 这会将所有记录加载到内存中.
Udit 的代码看起来不错,但需要一些更改。尝试以下代码:
Home.all.order(: inspection_id, :id).select('DISTINCT ON (inspection_id) id, inspection_id')
您可以使用窗口函数
ROW_NUMBER()
来标记每组中最靠前的记录(按id排序),然后只需选择那些最靠前的记录:inspection_id