选择类别中的随机元素
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;
给定 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;