Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como faço para gerar um número aleatório para cada linha em uma seleção T-SQL?


Dê uma olhada em SQL Server - Definir números aleatórios baseados em uma explicação muito detalhada.

Para resumir, o código a seguir gera um número aleatório entre 0 e 13 inclusive com uma distribuição uniforme:
ABS(CHECKSUM(NewId())) % 14
 

Para alterar seu intervalo, basta alterar o número no final da expressão. Tenha cuidado extra se precisar de um intervalo que inclua números positivos e negativos. Se você fizer errado, é possível contar duas vezes o número 0.

Um pequeno aviso para os malucos matemáticos na sala:há um viés muito pequeno neste código. CHECKSUM() resulta em números que são uniformes em todo o intervalo do tipo de dados sql Int, ou pelo menos tão próximo quanto meu teste (o editor) pode mostrar. No entanto, haverá algum viés quando CHECKSUM() produzir um número na extremidade superior desse intervalo. Sempre que você obtém um número entre o número inteiro máximo possível e o último múltiplo exato do tamanho do seu intervalo desejado (14 neste caso) antes desse número inteiro máximo, esses resultados são favorecidos sobre a parte restante do seu intervalo que não pode ser produzido a partir de esse último múltiplo de 14.

Como exemplo, imagine que todo o intervalo do tipo Int seja apenas 19. 19 é o maior inteiro possível que você pode armazenar. Quando CHECKSUM() resulta em 14-19, eles correspondem aos resultados 0-5. Esses números seriam muito favorecido sobre 6-13, porque CHECKSUM() tem duas vezes mais probabilidade de gerá-los. É mais fácil demonstrar isso visualmente. Abaixo está todo o conjunto possível de resultados para nosso intervalo de inteiros imaginário:
Checksum Inteiro:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Resultado do intervalo:0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5 
Você pode ver aqui que há mais chances de produzir alguns números do que outros:viés. Felizmente, o intervalo real do tipo Int é muito maior... tanto que na maioria dos casos o viés é quase indetectável. No entanto, é algo para estar ciente se você se encontrar fazendo isso por um código de segurança sério.