12

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

id | category | link | caption | image

我的目标是从表中的每个不同类别中获取随机行,用于表中的所有类别。然后计划将每一行分配给其各自类别的变量。

现在我正在使用多个类似的 SELECT 语句:

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

但这似乎不优雅,并且会产生更多的 DB 行程,这很昂贵。

我很确定在 Postgres 中有一种方法可以使用窗口函数来做到这一点,但我没有使用它们的经验,而且我不完全确定如何使用它来获得我想要的东西。

谢谢你的帮助!

4

1 回答 1

23

尝试类似:

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;
于 2013-08-30T18:28:31.193 回答