2013-01-09 42 views
6
訂單

這似乎難度比它應該是:Postgres的Rails的SELECT DISTINCT與

我希望能夠通過它的copy_count排序表,然後選擇了一個獨特的稱號只有事件,並限制查詢到第一99.

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

這將引發一個錯誤:

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

這表明我需要添加copy_count到DISTINCT,但是這也只能拉回來獨特copy_count記錄WHI ch可以是相同的!

注意:copy_count的順序必須先發生。

感謝

+0

所以,你想99'events.title'具有最高'copy_count'而沒有重複'events.title'? –

+0

這是正確的 – jay

回答

9

對於純粹的SQL它看起來就像:

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 

但我不知道怎麼寫的回報率。

+5

將它轉換成AR/Arel語法非常好。 – freemanoid

+1

是的問題確實指定了Rails - 任何人都知道如何用AR Query接口指定它? – Todd

4

試試這個:

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

這意味着ORDER BY需要 「events.title,copy_count DESC」。 DISTINCT ON要求您首先排序的是DISTINCT列的列表。如果您試圖獲得每個標題的最高結果,則必須先將它們分組爲具有相同標題的行集,然後才能按copy_count進行排序。如果這不是你想要做的,那麼DISTINCT ON不是正確的構造。在ORDER

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

這是因爲當你使用的語句DISTINCT ON,則必須使用其表達(如events.title)的表達式

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

因此,:

1

試試這個你只需要在order.title後面添加copy_count列就可以了

0

這就是我試過的:

Event.select('events.copy_count, RANDOM()').order('Random()').limit(10)