sql >> Databasteknik >  >> RDS >> PostgreSQL

Elegant PostgreSQL Group av för Ruby on Rails / ActiveRecord

PostgreSQL-funktionen du vill använda här är DISTINCT ON . Det finns två grundläggande sätt att göra den här frågan via ActiveRecord.

Den första metoden är att bara specificera :select och :order alternativ. Detta fungerar utmärkt när du har en ganska enkel fråga utan :joins eller :include .

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

Om du har en mer komplex fråga där ActiveRecord genererar sin egen SELECT kan du använda en underfråga för att välja målposter.

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

Observera att detta kan vara lite långsammare än den första metoden beroende på dina data. Jag skulle bara använda den här metoden om det behövs. Se till att jämföra med produktionsliknande data.



  1. Bufferten för litet fel när du använder XMLAgg/XMLElement

  2. radvis maximalt värde (av n kolumner) - Elegant tillvägagångssätt

  3. SQL Server:Bifoga felaktig version 661

  4. PostgreSQL fulltextsökning och trigramförvirring