PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Groupe PostgreSQL élégant par pour Ruby on Rails / ActiveRecord

La fonctionnalité PostgreSQL que vous souhaitez utiliser ici est DISTINCT ON . Il existe deux méthodes de base pour effectuer cette requête via ActiveRecord.

La première méthode consiste simplement à spécifier le :select et :order options. Cela fonctionne très bien lorsque vous avez une requête assez simple sans :joins ou :include .

Post.all(
  :select => 'DISTINCT ON (date::date) *',
  :order => 'date::date DESC, created_at DESC'
)

Si vous avez une requête plus complexe où ActiveRecord génère son propre SELECT clause, vous pouvez utiliser une sous-requête pour sélectionner les enregistrements cibles.

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'
)

Notez que cela pourrait être un peu plus lent que la première méthode en fonction de vos données. Je n'utiliserais cette méthode que si nécessaire. Assurez-vous de comparer avec des données de production.