在PostgreSQL表中为每个组选择随机行

14

我有一个大致如下的表格:

id | category | link | caption | image

我的目标是从表中的每个不同类别中获取一行随机数据,对于表中的所有类别都要这样做。计划是将每行分配给相应类别的变量。

目前我正在使用多个类似于以下的SELECT语句:

SELECT link, caption, image FROM table
       WHERE category='whatever'
       ORDER BY RANDOM() LIMIT 1`

但是这似乎不够优雅,并且会增加到数据库的访问次数,这是很昂贵的。

我相信在Postgres中有一种使用窗口函数的方式可以完成这个操作,但是我没有使用过,也不确定如何使用窗口函数来得到我想要的结果。

1个回答

29

试试这样做:

SELECT DISTINCT ON (category) *
FROM table 
ORDER BY category, random();

或者使用窗口函数:

SELECT * 
FROM (
SELECT *, row_number() OVER (PARTITION BY category ORDER BY random()) as rn
FROM table ) sub
WHERE rn = 1;

太好了!这两个都符合我的需求。谢谢你! - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接