2013-01-09 44 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)