主要是利用row_number() over()函数以及DBMS_RANDOM.value产生的随机数大小排序进行,再对固定的排序序号进行统一取值,
select id,
empno ,
row_number() over(partition by empno order by DBMS_RANDOM.value) as row_num
from emp t;
SCORE | EMPNO | ROW_NUM |
493652 | 21092 | 1 |
492765 | 21092 | 2 |
430016 | 21097 | 1 |
44490 | 21097 | 2 |
22688 | 22527 | 1 |
4498 | 22527 | 2 |
82139 | 22527 | 3 |
如果要随机获取每一个员工其中的一次score,则可以将上面的的结果作为子查询,在ROW_NUM=1,就可以获取随机记录了
select score, empno
from (select score,
empno,
row_number() over(partition by staffid order by DBMS_RANDOM.value) as row_num
from emp) t
where t.row_num = 1;
SCORE | EMPNO | ROW_NUM |
3652 | 21092 | 1 |
30016 | 21097 | 1 |
80329 | 22527 | 1 |
9219 | 22566 | 1 |
2956 | 23112 | 1 |
4052 | 23119 | 1 |
766 | 23164 | 1 |
如果不用分组,那就更简单了。
select * from (select * from emp order by dbms_random.value) where rownum < 10
随机获取
9
个记录。