选择类别中的随机元素

Selecting a random element in a category

给定 PostgreSQL 11 数据库中的 table,类似于:

CREATE TABLE yearly_urls ( year int, url varchar );

像这样在几年内有数千行 URL:

┌──────┬───────────┐
│ year | url       │
├──────┼───────────┤
│ 2009 │ /abc.jpeg │
│ 2009 │ /def.jpeg │
│ 2017 │ /ghi.jpeg │
│ 2018 │ /jkm.jpeg │
│ 2018 │ /nop.jpeg │
└──────┴───────────┘

编写查询以检索给定年份的随机 URL 的最佳方法是什么?

换句话说,在给定年份随机选择一个 URL。

使用distinct on:

select distinct on (year) year, url
from t
order by year, random();

Distinct on 很好。另外,您可以使用此查询;

WITH year_urls_cte AS (
  SELECT ROW_NUMBER() OVER (
    PARTITION BY year ORDER BY url DESC
  ) AS rn, year,url FROM yearly_urls order by random()
)
SELECT * FROM year_urls_cte
WHERE rn = 1
ORDER BY year;