Генерация нескольких строк случайных массивов в PostgreSQL? - PullRequest
0 голосов
/ 29 ноября 2018

Для тестирования базы данных я хотел бы сгенерировать количество строк, каждая из которых состоит из массива случайных чисел заданной длины.Я могу легко сгенерировать n рядов случайных чисел:

select round(random()*10) from generate_series(1,5);

, и я могу сгенерировать массив случайных чисел:

select array(select round(random()*10) from generate_series(1,5));

, но если я соберу их вместеподзапрос array() выполняется только один раз:

select array(select round(random()*10) from generate_series(1,5)) from generate_series(1,5);

    array     
--------------
 {10,8,1,7,4}
 {10,8,1,7,4}
 {10,8,1,7,4}
 {10,8,1,7,4}
 {10,8,1,7,4}
(5 rows)

Как мне запустить подзапрос для каждой строки?

1 Ответ

0 голосов
/ 29 ноября 2018

Я использую функцию:

create or replace function random_int_array(int, int)
returns int[] language sql as
$$
    select array_agg(round(random()* $1)::int)
    from generate_series(1, $2)
$$;

select random_int_array(10, 5)
from generate_series(1, 5)

 random_int_array 
------------------
 {3,8,4,7,5}
 {0,10,3,5,4}
 {2,2,0,2,10}
 {8,1,4,3,9}
 {7,4,1,3,6}
(5 rows)

Обратите внимание, что функция должна быть энергозависимой.


Обновить.Другой подход - генерировать 25 случайных значений и объединять их в 5 групп:

select array_agg(round(random()* 10))
from generate_series(1, 25) i
group by i % 5

db <> fiddle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...