簡體   English   中英

Postgres Rails選擇與訂單不同

[英]Postgres Rails Select Distinct with Order

這似乎比它應該更難:

我希望能夠通過它的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的順序必須先發生。

謝謝

對於純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中編寫它。

嘗試這個:

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列

嘗試這個:

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

這意味着ORDER BY需要是“events.title,copy_count DESC”。 DISTINCT ON要求您排序的第一件事是DISTINCT列。 如果您嘗試獲得每個標題的最高結果,則必須先將它們分組為具有相同標題的行集,然后才能按copy_count進行排序。 如果那不是你想要做的,那么DISTINCT ON不是正確的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM