Postgres Rails选择与订单不同

时间:2013-01-09 06:14:37

标签: sql ruby-on-rails postgresql

这似乎比它应该更难:

我希望能够通过它的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 ON,但这也只会撤回可能相同的唯一copy_count记录!

注意:copy_count的顺序必须先发生。

由于

4 个答案:

答案 0 :(得分:10)

对于纯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

但我不知道,如何用RoR写它。

答案 1 :(得分:4)

试试这个:

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

这是因为当您使用语句DISTINCT ON时,必须在ORDER BY表达式中使用其表达式(例如events.title)

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

因此,您只需要在订单声明中的events.title之后添加copy_count列

答案 2 :(得分:3)

试试这个:

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

答案 3 :(得分:3)

这意味着ORDER BY需要是“events.title,copy_count DESC”。 DISTINCT ON要求您排序的第一件事是DISTINCT列。如果您尝试获得每个标题的最高结果,则必须先将它们分组为具有相同标题的行集,然后才能按copy_count进行排序。如果那不是你想要做的,那么DISTINCT ON就不是正确的结构。