Вы хотите пронумеровать ваши строки случайным образом. И вы хотите сделать это дважды. Один раз для случайного разделения на 60% и 40%, один раз для случайного упорядочения всех столбцов.
Начиная с MySQL 8, вы можете использовать оконную функцию ROW_NUMBER
для этого. Однако применение этого дважды как row_number() over (order by rand())
приводит к тому же дважды случайному порядку, потому что MySQL видит, что вы упорядочиваете по одному и тому же выражению. Итак, немного измените выражение, например, добавив две разные константы.
Остальное - это два внешних соединения со 100% строками, одно для соединения с 60%, одно для соединения с оставшимися 40%.
with prepared as
(
select
number,
row_number() over (order by rand() + 0) as rn1,
row_number() over (order by rand() + 1) as rn2,
count(*) over () as cnt
from numbers
)
, p100 as (select rn1 as rn, number from prepared)
, p60 as (select rn2 as rn, number from prepared where rn2 / cnt <= 0.6)
, p40 as (select cnt - rn2 + 1 as rn, number from prepared where rn2 / cnt > 0.6)
select
p100.number as number1,
p60.number as number2,
p40.number as number3
from p100
left join p60 on p60.rn = p100.rn
left join p40 on p40.rn = p100.rn
order by p100.rn;
Демо: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b14419fd15f8a7987c10f2ef25ced826