sql >> Database teknologi >  >> RDS >> PostgreSQL

Elegant PostgreSQL Group af for Ruby on Rails / ActiveRecord

Den PostgreSQL-funktion, du vil bruge her, er DISTINCT ON . Der er to grundlæggende måder at lave denne forespørgsel på via ActiveRecord.

Den første metode er blot at angive :select og :order muligheder. Dette fungerer godt, når du har en ret simpel forespørgsel uden :joins eller :include .

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

Hvis du har en mere kompleks forespørgsel, hvor ActiveRecord genererer sin egen SELECT klausul, kan du bruge en underforespørgsel til at vælge målposterne.

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

Bemærk, at dette kan være en smule langsommere end den første metode afhængigt af dine data. Jeg ville kun bruge denne metode, hvis det var nødvendigt. Sørg for at benchmarke med produktionslignende data.



  1. CriteriaQuery måned og år filter

  2. EXECUTE...USING statement i PL/pgSQL virker ikke med posttype?

  3. MySQL for at vælge maks. værdi mellem tændt og slukket tidsstempler plus 3 sekunder

  4. psql fatal rolle eksisterer ikke