PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Elegant PostgreSQL Group por para Ruby on Rails / ActiveRecord


O recurso do PostgreSQL que você deseja usar aqui é DISTINCT ON . Existem duas maneiras básicas de fazer essa consulta via ActiveRecord.

O primeiro método é apenas especificar o :select e :order opções. Isso funciona muito bem quando você tem uma consulta bastante simples sem :joins ou :include .
Post.all(
  :select => 'DISTINCT ON (date::date) *',
  :order => 'date::date DESC, created_at DESC'
)

Se você tiver uma consulta mais complexa em que o ActiveRecord gera seu próprio SELECT cláusula, você pode usar uma subconsulta para selecionar os registros de destino.
Post.all(
  :joins => 'INNER JOIN (SELECT DISTINCT ON (date::date) id FROM posts ORDER BY date::date DESC, created_at DESC) x ON x.id = posts.id'
)

Observe que isso pode ser um pouco mais lento que o primeiro método, dependendo dos seus dados. Eu só usaria esse método se necessário. Certifique-se de fazer benchmark com dados de produção.