获取每个组的第一条记录列表

时间:2014-07-08 15:48:37

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

我有一个Log模型,其中包含以下列:

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

现在,我想获取username订购的每个created_at的第一个日志。

执行此操作的一种方法是为每个用户名运行以下查询:

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

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

3 个答案:

答案 0 :(得分:3)

DISTINCT ON的另一种情况:

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

为您提供"第一个"的整行。每username条目。

详细说明:
Select first row in each GROUP BY group?

Ruby / AR / Postgres的相似答案:
Display latest messages from messages table, group by user

如何执行原始SQL:
Table join sql to rails active record query

我不是Ruby专家,但这种Ruby语法应该有效:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

这将为您提供如下查询:

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

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