Estou tentando carregar uma tabela com valores que são gerados aleatoriamente com base em outra tabela. O problema é que o conjunto de resultados do final Cross Join
, não é único (aleatório) para cada uma das linhas da tabela final cruzada.
CTE desconstruído
; with MinMax as -- Step one get the range of values for each `DetailCategoryId`
(
select distinct DetailCategoryId,
min(DetailId) over(partition by DetailCategoryId) as [Min]
, max(DetailId) over(partition by DetailCategoryId) as [Max]
from Ref.Detail
)
, RandProcess as -- Step two pick a random number between the range for each
(
select MM.DetailCategoryId
, (MM.[Min] + FLOOR(RAND() * (MM.[Max] + 1 - MM.[Min]))) as Rando
from MinMax MM
)
O passo final é criar uma tabela de referência cruzada Cross JOIN
que dará o conjunto de RandProcess
em cada item. .
select PRJ.ProjectId, RD.DetailCategoryId, RD.Rando
from info.Project PRJ
CROSS JOIN RandProcess RD
O problema é que cada conjunto de dados na PRJ
tabela é o mesmo. Aqui estão as duas primeiras linhas de cada conjunto de PRJ
dados.
10000 101 7
10000 102 10
...
10001 101 7
10001 102 10
...
10002 101 7
10002 102 10
Pergunta
Como posso fazer com que cada um dos conjuntos de PRJs seja diferente (aleatório) para cada uma das linhas do PRJ?
10000 101 7
10000 102 10
...
10001 101 4
10001 102 11
...
10002 101 1
10002 102 14
Por que
Meu objetivo é inserir esses valores em outra tabela como valores de teste para cada um dos PRJ
elementos de dados.
RAND()
é avaliado uma vez e, portanto, você obtém o mesmo valor para todas as linhas.Você pode usar
newid()
para simular um valor aleatório.checksum()
para convertê-lo em inteiro eabs()
retornar o valor absoluto. Para entrar no intervalo mínimo e máximo necessárioAlterações no seu
RandProcess
cte