如何根据两个字段Ruby获取唯一记录

问题描述 投票:0回答:4

我需要根据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 不兼容

接下来我可以尝试什么?

mysql ruby-on-rails ruby-on-rails-5 rails-activerecord
4个回答
1
投票

您没有指定您的 RDBMS,但在 PostgreSQL 中您可以使用

DISTINCT ON

Home.select('DISTINCT ON (inspection_id) *')

0
投票

首先,我认为这不是一个有效的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 端执行独特的逻辑 - 但如果您有成千上万行,这不是一个好的解决方案 - 这会将所有记录加载到内存中.


0
投票

Udit 的代码看起来不错,但需要一些更改。尝试以下代码:

Home.all.order(: inspection_id, :id).select('DISTINCT ON (inspection_id) id, inspection_id')

0
投票

您可以使用窗口函数

ROW_NUMBER()
来标记每组中最靠前的记录(按id排序),然后只需选择那些最靠前的记录:
inspection_id

© www.soinside.com 2019 - 2024. All rights reserved.