【问题标题】:How to get 2 or more records per unique column value in ActiveRecord?如何在 ActiveRecord 中为每个唯一列值获取 2 条或更多记录?
【发布时间】:2019-09-24 20:28:51
【问题描述】:

如何在 ActiveRecord 中为每个唯一列值获取 2 条或更多记录?

给定:

Name     | School
Jonathan | Sunshine College

Dylan    | Sunshine College
Matt     | Sunshine College
Joseph   | Sunshine College
Stephen  | Greenville School
Phil     | Greenville School
Warren   | Greenville School


JohnPaul | Greenville School

那么如果我想为每所学校输出 2 条记录,它将如下所示:

Name     | School
Jonathan | Sunshine College

Dylan    | Sunshine College
Stephen  | Greenville School
Phil     | Greenville School

如果我希望每所学校有 3 条记录,那么它将如下所示:

Name     | School
Jonathan | Sunshine College

Dylan    | Sunshine College
Matt     | Sunshine College
Stephen  | Greenville School
Phil     | Greenville School
Warren   | Greenville School



【问题讨论】:

  • 您使用的是什么 DBMS(“数据库”)?
  • 您希望“Matt”和“Warren”出现在输出表中吗?如果您只是想消除重复的姓名/学校对,那么 Matt 和 Warren 应该在那里。还是你想做别的事?
  • 您想要任何 2 条记录还是需要应用一些排序?
  • @SebastianPalma 我正在使用 Postgres
  • @LesNightingill 可能是,这真的取决于输入,如果我每所学校输入 1,那么它应该只显示 jonathan 和 stephen。如果每所学校 3 人,那么让 jonathan、dylan 和 matt 去阳光,然后让 stephen、phil 和 warren 去格林维尔

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

您可以按您需要的列值对表的数据进行分区。之后,您可以使用条件来判断每个分区需要多少条记录:

Student
  .from(
    Student.select('*, row_number() OVER (PARTITION BY school) AS rownum')
  )
  .select('*')
  .where('rownum < 2')

【讨论】:

    【解决方案2】:

    这里是不使用sql的方法。

    Student.group(:school)
       .each{|student| Student.where(school: student.school)
       .first(2)
       .each{|result| puts "#{result.name.ljust(20, ' ')}| #{result.school}"}}
    
    # Phil                | Greenville School
    # Warren              | Greenville School
    # Jonathan            | Sunshine College
    # Dylan               | Sunshine College
    

    【讨论】:

      【解决方案3】:

      您可以uniq 将模型集合转换为可以比较是否相等的属性列表:

      MyModel.all.pluck(:first_name, :last_name).uniq
      

      【讨论】:

      • 我可以使用它,但我可以在哪里放置一个“N”变量来获取每所学校的 N 个唯一记录。因此,如果 N 输入为 2,那么我应该像上面的示例一样每所学校获得 2 条记录
      • 自从我回答后你已经改变了问题。
      • 是的,我做到了,uniq 仍然适用,但输出保持不变。为了更清楚,我还添加了另一个结果集。
      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多