【问题标题】:Get a list of first record for each group获取每个组的第一条记录列表
【发布时间】:2014-08-29 10:48:33
【问题描述】:

我有一个带有以下列的Log 模型:

["id", "username", "event", "parameters", "extras", "created_at", "updated_at"]

我有索引created_atusername
现在,我想获取由created_at 排序的每个username 的第一个日志。

一种方法是为每个用户名运行以下查询:

log = Log.where("username = :username", username: username).order(:created_at).first

但这显然会查询数据库很多次(等于用户名的数量)。有没有办法只做一个数据库查询?

【问题讨论】:

  • 在 2 列上设置一个索引很重要,例如:“add_index :logs, [:username, :created_at]”。如果您单独为每列设置索引,则它不起作用。

标签: sql ruby-on-rails postgresql activerecord greatest-n-per-group


【解决方案1】:

DISTINCT ON 的另一种情况:

SELECT DISTINCT ON (username) *
FROM   log
ORDER  BY username, created_at;

为每个username 的“第一个”条目返回整行

详情:

Ruby / AR / Postgres 的类似答案:

如何执行原始 SQL:

这个 Ruby 语法应该可以工作:

Log.select("DISTINCT ON (username) *").order(:username, :created_at)

【讨论】:

  • 这正是我想要的。非常感谢:)
  • @Peeyush:我添加了 Ruby 语法。
  • 我能够弄清楚:)。感谢您提供完整的答案。
【解决方案2】:

Log.select("DISTINCT username").order(:created_at)

【讨论】:

  • 我不想要用户名列表!如问题所述,我对其他列(parametersextras)感兴趣,以获取每个组中的第一条记录。
【解决方案3】:

我认为group by 子句可以解决问题。

Log.group(:username).order(:created_at)

这会给你一个这样的查询:

SELECT `logs`.* from `logs` GROUP BY username ORDER BY `logs`.`created_at` ASC

这将返回每个username 的第一条记录。

【讨论】:

  • 它不返回 PostgreSQL 中的第一个日志。我认为它在 MySQL 中是这样做的。无论如何,Thannx。 :)
猜你喜欢
  • 2021-08-31
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
相关资源
最近更新 更多