14

这似乎比应该的更难:

我希望能够通过它的 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

4 回答 4

12

对于纯 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 中编写它。

于 2013-01-09T08:39:59.410 回答
8

尝试这个:

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 

因此,您只需在 order 语句中的 events.title 之后添加 copy_count 列

于 2015-12-30T18:32:53.643 回答
4

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

于 2013-01-09T20:42:42.347 回答
4

尝试这个:

Event.order("copy_count DESC").limit(99).select(:title).uniq
于 2013-01-09T08:40:39.163 回答