sql - 如何随机化 DISTINCT ON 结果的顺序?

标签 sql postgresql activerecord

我有一个播客剧集表

id | title | podcast_id | publication_date
 1 |   "a" |          1 |            today
 2 |   "b" |          2 |            today
 3 |   "c" |          1 |            yesterday
 4 |   "d" |          2 |            yesterday

通过此查询,我可以获得每个播客的最新剧集。

SELECT DISTINCT ON (episodes.podcast_id) episodes.* FROM "episodes"
WHERE ...
ORDER BY episodes.podcast_id, "episodes"."publication_date" DESC

结果

id | title | podcast_id | publication_date
 1 |   "a" |          1 |            today
 2 |   "b" |          2 |            today

我想随机化返回的播客的顺序,以便 podcast_id 2 可能会在 1 之前返回,但添加 RANDOM()进入决赛ORDER BY子句更改为给定播客选择的剧集。

总结:我希望以随机顺序播放每个播客的最新剧集。

编辑:我应该提到这个查询是将许多 ActiveRecord 范围链接在一起的结果。这是翻译为 ActiveRecord 的最终答案

# This ActiveRecord statement is equivalent to the above SQL query
episodes = Episode
  .unscoped
  .select("DISTINCT ON (episodes.podcast_id) episodes.*")
  .order("episodes.podcast_id, episodes.publication_date")

Episode
  .unscoped
  .from("(#{sql.to_sql}) episodes")
  .order("random()")

我不确定这是否是一个好方法。我认为它们的优点是

  1. 单个查询
  2. 结果是ActiveRecord_Relation,可以继续链接limitpluck

最佳答案

select *
from (
    SELECT DISTINCT ON (episodes.podcast_id) episodes.*
    FROM "episodes"
    WHERE ...
    ORDER BY episodes.podcast_id, "episodes"."publication_date" DESC
) s
order by random()

关于sql - 如何随机化 DISTINCT ON 结果的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410632/

相关文章:

mysql - 通过连接两个表来更新第三个表

Postgresql 自定义函数速度慢,php 但如果使用带有 gin 索引的文本搜索直接在 psql 上输入则速度很快

MySQL 到 PostgreSQL 的 to_tsvector、@@ 和 to_tsquery?

ruby-on-rails - 抑制 Rails 模式加载

mysql - 在 activerecord 级别捕获 MySql 触发器

SQL查询识别数字中的重复数字

sql - 将运行 SQL 语句中未使用的 CTE

mysql - 从最高到最低分组

postgresql 从查询的多个列中返回第一个正值

c# - 包含的亚音速查询构造(Guid)