Postgres Rails选择与订单不同

jay*_*jay 12 sql postgresql ruby-on-rails

这似乎比它应该更难:

我希望能够通过它的copy_count对表进行排序,然后只选择具有唯一标题的事件,并将该查询限制为前99个.

 Event.order("copy_count DESC").select("DISTINCT ON (events.title) *").limit(99)
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

ActiveRecord::StatementInvalid: PG::Error: ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
Run Code Online (Sandbox Code Playgroud)

哪个建议我需要将copy_count添加到DISTINCT ON,但这也只会拉回可能相同的唯一copy_count记录!

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

谢谢

Igo*_*nko 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
Run Code Online (Sandbox Code Playgroud)

但我不知道,如何在RoR中编写它.

  • 将它转换为AR/Arel语法会很棒. (5认同)

Ale*_*gel 5

尝试这个:

Event.select("DISTINCT ON (events.title) *").order("events.title, copy_count DESC").limit(99)
Run Code Online (Sandbox Code Playgroud)

发生这种情况的原因是,当您使用语句DISTINCT ON时,必须在ORDER BY表达式中使用其表达式(例如events.title)。

SQL ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions 
Run Code Online (Sandbox Code Playgroud)

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