oracle随机取20条数据,【SQL】使用SQL语句完成20个护士随机分配到两个医院的任务...

本文介绍了如何使用随机数方法将20名护士公平地分配到两个医院。通过创建护士名单,利用Oracle的DBMS_RANDOM.RANDOM函数进行随机排序,实现了数据的打乱并分成两组。此外,还探讨了在Excel中使用RAND()函数和编程方式实现相同目标,提供多种解决方案供选择。
摘要由CSDN通过智能技术生成

今天被问到有关如果将20个人随机的分配到两个组的问题,现将实现方法分享在此,供参考。1.问题需求有20个护士,需要随机取出10位护士分配到A医院,剩下的10位护士分配到B医院。为了单位的分配公平,必须是随机生成这个结果。2.问题解析该问题转换为最浅显的解释就是,对给出的1-20连续的数字,任意打乱,将打乱的结果排成一列。前10人就去A医院,后10人就去B医院。3.模型化这个问题create table name_list (name varchar2(30));insert into name_list values ('secooler1');insert into name_list values ('secooler2');insert into name_list values ('secooler3');insert into name_list values ('secooler4');insert into name_list values ('secooler5');insert into name_list values ('secooler6');insert into name_list values ('secooler7');insert into name_list values ('secooler8');insert into name_list values ('secooler9');insert into name_list values ('secooler10');insert into name_list values ('secooler11');insert into name_list values ('secooler12');insert into name_list values ('secooler13');insert into name_list values ('secooler14');insert into name_list values ('secooler15');insert into name_list values ('secooler16');insert into name_list values ('secooler17');insert into name_list values ('secooler18');insert into name_list values ('secooler19');insert into name_list values ('secooler20');commit;sec@ora10g> select * from name_list;NAME------------------------------secooler1secooler2secooler3secooler4secooler5secooler6secooler7secooler8secooler9secooler10secooler11secooler12secooler13secooler14secooler15secooler16secooler17secooler18secooler19secooler2020 rows selected.4.方案一使用Oracle的随机函数实现这个需求最简单直观。方法如下:在将name_list表打乱之前的内容如下:sec@ora10g> select rownum, t.* from (select * from name_list) t;ROWNUM NAME---------- ------------------------------1 secooler12 secooler23 secooler34 secooler45 secooler56 secooler67 secooler78 secooler89 secooler910 secooler1011 secooler1112 secooler1213 secooler1314 secooler1415 secooler1516 secooler1617 secooler1718 secooler1819 secooler1920 secooler2020 rows selected.我们使用随机数dbms_random.random对name_list表进行打乱后输出。sec@ora10g> select rownum, t.* from (select * from name_list order by dbms_random.random) t;ROWNUM NAME---------- ------------------------------1 secooler102 secooler93 secooler194 secooler75 secooler36 secooler47 secooler158 secooler169 secooler1810 secooler1211 secooler112 secooler513 secooler1314 secooler1415 secooler616 secooler1717 secooler218 secooler1119 secooler820 secooler2020 rows selected.每次执行这个条语句都可以完成一次打乱的需求,自行测试,不赘述。原理:对非常大的随机数进行排序以达到顺序打乱的目的。5.方案二基于第一种方法,只要我们在name_list表中添加一列随机数列,然后再按照这一列进行排序即可。sec@ora10g> alter table name_list add random number;Table altered.sec@ora10g> update name_list set random=dbms_random.random;20 rows updated.sec@ora10g> commit;Commit complete.sec@ora10g> select * from name_list;NAME                               RANDOM------------------------------ ----------secooler1                      -1.645E+09secooler2                      1441099457secooler3                      -1.133E+09secooler4                       600418771secooler5                      1277685516secooler6                      -177083719secooler7                      -599498736secooler8                       352353250secooler9                       107600398secooler10                      718837634secooler11                     -830730584secooler12                      906134037secooler13                     -1.082E+09secooler14                       11469174secooler15                     -452139368secooler16                     -2.119E+09secooler17                      760306608secooler18                      158227683secooler19                       21379248secooler20                     161762465020 rows selected.sec@ora10g> select rownum, t.* from (select name from name_list order by random) t;ROWNUM NAME---------- ------------------------------1 secooler162 secooler13 secooler34 secooler135 secooler116 secooler77 secooler158 secooler69 secooler1410 secooler1911 secooler912 secooler1813 secooler814 secooler415 secooler1016 secooler1717 secooler1218 secooler519 secooler220 secooler2020 rows selected.OK,这样,我们就完成了一次数据打乱的动作。6.方案三基于上面添加辅助字段的方法,我们可以大胆的将这种方法推广到Excel中。我们可以使用Excel的“=rand()”方法生成随机数,然后按照这个随机数列进行排序及可完成数据随机打乱功能。在此基础上可以录制一段“宏”,使得这个过程可以自动化完成,这样每次执行宏都会获得一个新的随机排列,甚是方便。这个方案任何人都可以完成,毕竟Office软件还是很普及的。7.方案四这里只给出思路,不做具体实现。思路:构造另外一个表T,从表name_list中随机取出一条记录插入到表T中,同时将name_list中的该条记录删除;再从表name_list中随机取出一条记录插入到表T中,同时将name_list中的该条记录删除,按照这个方法循环下去,直到所有数据均插入到T表中,此时T表就是一个打乱后的结果。8.方案五如果想用“牛刀”完成这个需求,也可以通过编写一段小程序或小脚本来完成(注意在编写过程中注意选取的内容不可以重复)。9.小结往往一个需求拿到手中后,解决方案不止一个,这时,我们就需要认真的甄别那种方案的代价最低。关键是快速的转换问题需求为我们熟识技术点。本例中使用SQL的随机函数排序方法最简单,使用Excel方法最实用,使用程序或脚本方法较复杂,各取所需最重要。Good luck.secooler10.04.28-- The End --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值