如果你想:
......从基表
共有两排...并给每页一个平等的机会出现在示例中,无论表中有多少个条目:
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;
您必须测试哪个更快。
如果您正在处理一张大桌子并且需要快速表现,那么您可以做得更好。 Here is one way how.
如果,另一方面,你想:
......总共两行从表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
);
的UNION
的第二SELECT
周围的括号是必需的,以允许个人订购。
经过PostgreSQL 9.1测试。窗口函数需要版本8.4或更高版本。
你想从基表中得到2个随机页面(给页面提供很多条目的机会更好),或者每页有相同机会的2个随机页面? –
[http:// stackoverflow。COM /问题/ 12007297/PostgreSQL的 - 选择 - 与唯一的价值/ 12012445](http://stackoverflow.com/questions/12007297/postgresql-select-with-unique-value/12012445)? – aymeric