Генерация случайных внутри цикла в postgresql - PullRequest
1 голос
/ 14 марта 2019

Я хочу выполнить несколько раз (скажем, 30) "эксперимент", который включает случайные числа

Мой подход был:

select  
  rnd  
from 
  generate_series(0,30) as l,   -- number of times
lateral (
  select random() as rnd -- the "experiment"
) as t ;

Вы можете прочитать это как "Выполните 30 раз эксперимент".

Проблема в том, что этот код генерирует 30 точных чисел.

Пожалуйста ПРИМЕЧАНИЕ : The"Часть эксперимента, очевидно, более сложная, но где-то в ней создаются сотни случайных чисел за эксперимент .т.е. я хочу сгенерировать эти сотни случайных чисел 30 раз.Это важно, потому что я знаю, что могу выполнить

select random() from generate_series(0,30)

и получить 30 различных случайных чисел, но это не , что я намерен сделать.

1 Ответ

3 голосов
/ 14 марта 2019

Ваша проблема в том, что запрос LATERAL не зависит от левого табличного выражения, поэтому PostgreSQL оценивает его только один раз.

Чтобы оценить его один раз для каждой строки в левом табличном выражении, введите зависимость:

SELECT rnd
FROM generate_series(0,30) as l   -- number of times
CROSS JOIN LATERAL (
   SELECT l.l * 0 + random() AS rnd -- the "experiment"
) AS t;
...