2013-01-09 13 views
6

Wydaje trudniej niż powinno być:Postgres Szyny select distinct z Zakonu

Chcę móc sortować tabelę przez to copy_count, następnie wybierz tylko zdarzenia z wyjątkowym tytułem, a ograniczenie to zapytanie do pierwszego 99.

Event.order("copy_count DESC").select("DISTINCT ON (events.title) *").limit(99) 

ten zgłasza błąd:

ActiveRecord::StatementInvalid: PG::Error: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

które sugerują, muszę dodać copy_count do DISTINCT ON, ale to też tylko przyhamować unikatowe rekordy copy_count wHI ch może być taki sam!

Uwaga: zamówienie przez copy_count MUSI się wydarzyć jako pierwsze.

Dzięki

+0

A więc chcesz 99 'events.title' z najwyższym' copy_count' bez duplikatu 'events.title'? –

+0

To jest poprawne – jay

Odpowiedz

9

Dla czystego SQL będzie wyglądać następująco:

SELECT * 
FROM (SELECT DISTINCT ON (events.title) * 
     FROM events 
     ORDER BY events.title, events.copy_count DESC) top_titles 
ORDER BY events.copy_count DESC 
LIMIT 99 

Ale nie wiem, jak napisać to w RoR.

+5

Byłoby świetnie przekonwertować go na składnię AR/Arel. – freemanoid

+1

tak, pytanie określa Railsy - każdy wie, jak to określić za pomocą interfejsu zapytań AR? – Todd

4

Spróbuj tego:

Event.order("copy_count DESC").limit(99).select(:title).uniq 
2

Oznacza to, że ORDER BY musi być "events.title, copy_count DESC". DISTINCT ON wymaga, aby pierwszą rzeczą, którą sortujesz, była lista kolumn DISTINCT. Jeśli próbujesz uzyskać najwyższy wynik na tytuł, musisz najpierw pogrupować je w zestawy wierszy o tym samym tytule, zanim będziesz mógł posortować je według copy_count. Jeśli to nie jest to, co próbujesz zrobić, to DISTINCT ON nie jest prawidłową konstrukcją.

1

Spróbuj tego:

Event.select("DISTINCT ON (events.title) *").order("events.title, copy_count DESC").limit(99) 

Dzieje się tak dlatego, że podczas korzystania z DISTINCT ON oświadczenie, należy użyć jego ekspresji (np events.title) w kolejności wyrażeniami

SQL ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

Zatem wystarczy dodać kolumnę copy_count zaraz po events.title w wyciągu z zamówienia

0

Oto, co próbowałem:

Event.select('events.copy_count, RANDOM()').order('Random()').limit(10) 
Powiązane problemy