如果您想要:
... 来自基表的总共两行
... 并让每个页面都有相同的机会出现在示例中,无论它在表中有多少条目:
SELECT *
FROM (
SELECT DISTINCT ON (page) *
FROM mydata
ORDER BY page, random() -- pick one random entry per page
) x
ORDER BY random() -- pick two random pages
LIMIT 2;
或者,使用窗口函数:
WITH x AS (
SELECT *, row_number() OVER (PARTITION BY page ORDER BY random()) AS rn
FROM mydata
)
SELECT id, page, text
FROM x
WHERE rn = 1
ORDER BY random()
LIMIT 2;
您必须测试哪个更快。
如果你正在处理一个大表并且需要快速的性能,你可以做得更好。这是一种方法。
另一方面,如果您想要:
... 表中总共有两行mydata
... 并给每个条目(几乎)相等的机会a 出现在样本中,有效地为具有更多条目的页面提供更好的机会在表中。
机会仍然不是真正相等的 - 根据定义,您的限制增加了稀有页面条目的机会。
WITH x AS (
SELECT *
FROM mydata
ORDER BY random()
LIMIT 1
)
SELECT * FROM x
UNION ALL
(
SELECT m.*
FROM mydata m
, x
WHERE m.page <> x.page -- assuming page IS NOT NULL
ORDER BY random()
LIMIT 1
);
第二个周围的括号SELECT
是UNION
允许单独订购的。
使用 PostgreSQL 9.1 测试。窗口函数需要 8.4 或更高版本。