十分な行があると仮定して、ウィンドウ関数を使用できます。このトリックで均等に配信された10%のサンプルを取得するには:
select t.*
from (select t.*, row_number() over (partition by account order by seqnum_within_account) as seqnum
from (select t.*,
row_number() over (partition by account, dept order by (select null)) as seqnum_within_account,
count(*) over (partition by account) as cnt
from t
) t
) t
where seqnum * 10 <= cnt;
これは何をしていますか?最も内側のselect
は、各アカウント内の各部門に順次番号を割り当てます。次に、各アカウント内でシーケンス番号を割り当てるため、部門間で均等に分散されます。したがって、n個の部門がある場合、最初のn個の値は異なる部門からのものであり、次のn個など(十分な行があると仮定して)です。
最後のwhere
は10%のサンプルを取ります。
注:1つのアカウントの情報のみを必要とする場合は、最も内側のサブクエリにwhere account = ???
を追加できます。
あなたは、各部門の10%、または部門で均等に分割全人口の10%が必要ですか?また、ランダムサンプルが必要ですか? – Kateract