必要な場合:
... ベース テーブルから合計 2 行
... そして、テーブル内のエントリ数に関係なく、すべてのページがサンプルに表示される機会を均等にします。
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;
どちらが速いかをテストする必要があります。
大きなテーブルを扱っていて、高速なパフォーマンスが必要な場合は、より良い結果が得られます。これが方法の1つです。
一方、必要な場合:
... テーブルから合計 2 行mydata
...すべてのエントリに (ほぼ) 均等にサンプルに表示される機会を与え、より多くのエントリを持つページにより良い機会を効果的に与えます。テーブルで。
チャンスはまだ真に等しいわけではありません - あなたの制限は定義上、まれなページのエントリのチャンスを増やします.
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
の 2 番目を囲む括弧は、UNION
個別の注文を可能にするために必要です。
PostgreSQL 9.1 でテスト済み。ウィンドウ関数には、バージョン 8.4 以降が必要です。