我需要从表中提取数据(所有数据的100%),并将其拆分为3列。
示例:我们有数据:
numbers
80174
91467
1105
12040
62224
46508
33149
61384
10811
84923
我们需要采取:
| Random 60% of all | Random 40% of all
| unique and not | unique and not
All | contained in 40% | contained in 60%
| of the column | of the column
----------------------------------------------
80174 | 84923 | 33149
91467 | 91467 | 61384
1105 | 1105 | 10811
12040 | 62224 | 80174
62224 | 12040 |
46508 | 46508 |
33149 | |
61384 | |
10811 | |
84923 | |
3条答案
按热度按时间hgtggwj01#
它使用order by rand()函数将行随机分配,并使用mysql 8窗口函数row\u number将第一个数字拆分为60/40,然后再将其合并。
您可以在mysql 5.x中重建row\u number函数,但它没有那么漂亮
编辑torpas建议后,计算必要的行数。编辑2:在福帕斯的另一个评论之后,我用兰德取代了ceil
我认为必须有一个精确的解决方案,其中更多的是使用模
db<>在这里摆弄
6ie5vjzr2#
您可以根据指定分组
rand()
:请注意,这大约是60%/40%。如果要精确拆分,可以使用窗口函数:
vmpqdwk33#
你想随机给你的行编号。你想做两次。一次用于随机拆分为60%和40%,一次用于所有列的随机排序。
从mysql 8开始,您可以使用window函数
ROW_NUMBER
为了这个。两倍于row_number() over (order by rand())
但是,会导致相同的随机顺序出现两次,因为mysql看到您使用相同的表达式进行排序。所以,稍微修改一下表达式,例如,添加两个不同的常数。其余的两个外部连接到100%行,一个连接60%,一个连接其余的40%。
演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b14419fd15f8a7987c10f2ef25ced826