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を使用する場合、その式(events.titleなど)をORDERBY式で使用する必要があるために発生します。

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

したがって、orderステートメントのevents.titleの直後にcopy_count列を追加する必要があります。

于 2015-12-30T18:32:53.643 に答える
4

これを試して:

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

これは、ORDER BYが「events.title、copy_countDESC」である必要があることを意味します。DISTINCT ONでは、最初にソートするのはDISTINCTである列のリストである必要があります。タイトルごとに最高の結果を得ようとしている場合は、copy_countで並べ替える前に、まず同じタイトルの行のセットにグループ化する必要があります。それがあなたがやろうとしていることではない場合、DISTINCTONは正しい構成ではありません。

于 2013-01-09T20:42:42.347 に答える