oracle
DB

【DB】名寄せ?重複のランダム抽出?の際のメモ

重複データをランダムで取得するというお題があり、なかなか出てこなかったのでメモを書く

重複を抜き出すとかdistinctとかでできるのですが、
重複したデータをランダムで取得する方法が見つかりませんでした。

例えばこんな時

世界中にいる同じ苗字の人の1人から鬼ごっこの鬼を決めたい
ランダムで
佐藤さんがいっぱいいます、高橋さんがいっぱいいます、田中さんが。。。
選ばれた世界の佐藤さんの中の1人、世界の田中さんの中の1人にメールを送付しなければいけない

結論は

パフォーマンスとか気にしてないし、DB側で処理しなくてもいいなどありますが...

nayose.sql
    SELECT id,苗字,名前,住所, メール
            ,row_number() over (partition by 苗字 order by dbms_random.random) as 当選番号
    FROM 人類
    WHERE 当選番号=1


解説

当選番号

当選番号をカテゴリごとにランダム付与します。今回は世界中の佐藤さんの中の一人を選ぶため1としています。

partition by

苗字で一人に絞り込み

order by dbms_random.random

苗字でカテゴライズされた人たちにランダムに番号を振ります