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

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

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

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

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

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

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

DISTINCT ON另一个案例:

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

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

细节:
选择每个GROUP BY组中的第一行?

类似的答案Ruby / AR / Postgres:
从用户分组显示消息表中的最新消息

如何执行原始SQL:
表连接sql到rails活动记录查询

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

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

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

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

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

这将为您提供如下查询:

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

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