通过SQL解读财富的分配

还是继续昨天的问题,知乎上一个蛮有意思的问题,数据分析师做了一个很有意思的解读。

题目是:房间里有100个人,每人都有100元钱,他们在玩一个游戏。每轮游戏中,每个人都要拿出一元钱随机给另一个人,最后这100个人的财富分布是怎样的?

我们用SQL来解读一下,当然还可以测试的更充分一些。

首先我们创建一个表test_money,里面是存放很简单的数据,pid就是人员编号,money就是手头的财富。

create table test_money(pid number primary key,money number);

先插入100条记录。 insert into test_money select level,1 from dual connect by level <=100;

接着我使用如下的脚本来批量模拟实验,即循环pid,从1到100,依次扣减一块,依次随机添加一块。

delete from test_money; insert into test_money select level,1 from dual connect by level <=100; commit; begin for i in 1..100 loop update test_money set money=money-1 where pid=i; update test_money set money=money+1 where pid=trunc(dbms_random.value(0,100)) ; end loop; end; /

运行之后查看数据,第一次是这样的效果,可以看到,0,1,2的数据占比差不多是95% MONEY COUNT(*) ---------- ---------- 1 37 2 25 4 1 3 3 0 34 再来依次测试,数据有一定的变化,但是占比差别不大。 MONEY COUNT(*) ---------- ---------- 1 42 2 19 4 2 3 4 0 33

我们能不能继续改进一下,这么模拟测试100次,最后得到的平均数就相对更有说服力了。

为此我们创建一个表test_money_sum,插入统计数据。

create table test_money_sum(money int,money_cnt number); insert into test_money_sum select money,count(*)from test_money group by money;

按照这样的逻辑,我可以很轻松的模拟100遍这个实验。

使用如下的shell脚本来批量更新数据,得到最后的结果。

for i in {1..100} do sqlplus -s xx/xx<<EOF @test.sql EOF done sqlplus -s xx/xx<<EOF select money,sum(money_cnt)/100 from test_money_sum group by money; EOF

到了出数据的时候了,100次测试之后,财富的分布情况如下:

金钱

平均人数

0

37.36

1

36.57

2

18.12

3

6.16

4

1.43

5

0.28

6

0.07

8

0.01

如果用图表来查看会更好一些

而所占的比例用这个饼图来看更加直白。

整体来看,这个实验还是很有意蕴的,想要突破现有的思维桎梏,达到一个新的高度,这个比例还是很低的,但是无论如何还是需要花很大的功夫的。

我们再想一下,如果这个样本是1000万呢。

这就涉及几个技巧,首先是初始化数据,1000万的数据初始化可以这么来做。

SQL> insert into test_money select rownum,1 from xmltable('1 to 10000000'); 10000000 rows created. Elapsed: 00:00:29.50

半分钟即可搞定,而如何批量更新呢,可以参考这个pl/sql

declare cursor test_cur is select pid from test_money; type rec_type is table of test_cur%rowtype index by binary_integer; recs rec_type; begin open test_cur; fetch test_cur bulk collect into recs; close test_cur; forall i in 1..recs.COUNT update test_money set money=money-1 where pid=recs(i).pid; update test_money set money=money+1 where pid=trunc(dbms_random.value(0,10000000)) ; commit; end; /

数据还在运行。稍后提供。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

大分区表的手工并行优化

这段时间饱受大分区表的性能之苦,碰到最大的一个分区表有1个t左右,操作起来每个细节都需要格外小心,我这次和大家分享的案例应用的分区表不是很大,有80G左右。但是...

31540
来自专栏AI科技评论

开发 | 模型表现不好怎么办?37条妙计助你扭转局势

AI 科技评论按:读论文,看别人的模型的时候仿佛一切都顺利成章,可是等到自己训练模型的时候,麻烦一个接一个…… AI 科技评论找到了一篇国外大神 Slav Iv...

36960
来自专栏杨建荣的学习笔记

关于连续登录的问题探究

经常会在数据统计中取筛选连续性的数据,比如筛选连续三个月都登录的用户, 数据形式如下: 1 111 222 333 2 111 3 111 222 4 111 ...

368120
来自专栏TEG云端专业号的专栏

「科技·TEG」拓路前行-TDSQL追求极致体验的这一路

2007年,计费平台的一帮年轻人为了实现银行级的高可用、零错账的交易系统,加班加点讨论方案,长达几个月的反复头脑风暴与论证,终于提出了“TBOSS 7*24”容...

46470
来自专栏机器学习AI算法工程

数据科学家的4种数据科学工作,8项求职技能

“数据科学家”被誉为21世纪最性感的工作(Thomas Davenport和D.J. Patil在哈佛商业评论上曾发表的一篇文章中称),但如何成为一个数据科学家...

37180
来自专栏程序员互动联盟

一个程序员的奋斗历程

也许,你还为你的未来感到迷茫,也许,你还对程序员的历程感到神奇.就让我们来看看这位程序员的奋斗历程好了. 这些日子我一直在写一个实时操作系统内核,已有小成了,...

47780
来自专栏杨建荣的学习笔记

listener.ora,tnsnames.ora中一个空格的威力

最近几天被网络监听配置搞得焦头烂额,有时候配置没问题,有时候就出莫名其妙的问题,今天专门花时间总结了一下,希望对大家有所帮助。 listener.ora,tns...

42390
来自专栏杨建荣的学习笔记

DBMS_STATS收集统计信息的问题及解决

收集数据库的统计信息是dba工作的一部分,如果在数据快速增长的库上,统计信息如果收集的频率太慢,会对执行计划有一定的影响。 而对于逐渐客户饱和的系统来说,统计信...

35040
来自专栏机器学习AI算法工程

Excel 有哪些可能需要熟练掌握而很多人不会的技能?

作者:何明科 链接:https://www.zhihu.com/question/21758700/answer/91385842 在咨询公司、VC/PE...

418100
来自专栏杨建荣的学习笔记

oracle坏块修复实例

最近几天发现库里有坏块了,环境是11gR2, linux平台的64位的库。以下是我的修复办法,基于dbms_repair做的在线修复,也可以基于备份rman来修...

39390

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励