Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso generare un numero casuale per ogni riga in una selezione T-SQL?

Dai un'occhiata a SQL Server - Imposta numeri casuali basati su una spiegazione molto dettagliata.

Per riassumere, il codice seguente genera un numero casuale compreso tra 0 e 13 inclusi con una distribuzione uniforme:

ABS(CHECKSUM(NewId())) % 14

Per modificare l'intervallo, basta modificare il numero alla fine dell'espressione. Fai molta attenzione se hai bisogno di un intervallo che includa sia numeri positivi che negativi. Se sbagli, è possibile contare due volte il numero 0.

Un piccolo avvertimento per i matti di matematica nella stanza:c'è una leggera distorsione in questo codice. CHECKSUM() risultati in numeri che sono uniformi nell'intero intervallo del tipo di dati sql Int, o almeno il più vicino possibile a quanto il mio test (l'editor) può mostrare. Tuttavia, ci sarà una certa distorsione quando CHECKSUM() produce un numero all'estremità superiore di quell'intervallo. Ogni volta che ottieni un numero compreso tra l'intero massimo possibile e l'ultimo multiplo esatto della dimensione dell'intervallo desiderato (14 in questo caso) prima di quel numero intero massimo, quei risultati sono preferiti rispetto alla parte rimanente dell'intervallo che non può essere prodotto da quell'ultimo multiplo di 14.

Ad esempio, immagina che l'intero intervallo del tipo Int sia solo 19. 19 è l'intero più grande possibile che puoi contenere. Quando CHECKSUM() restituisce 14-19, questi corrispondono ai risultati 0-5. Quei numeri sarebbero pesanti favorito su 6-13, perché CHECKSUM() ha il doppio delle probabilità di generarli. È più facile dimostrarlo visivamente. Di seguito è riportato l'intero possibile insieme di risultati per il nostro intervallo di interi immaginari:

Checksum Integer: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Range Result:     0 1 2 3 4 5 6 7 8 9 10 11 12 13  0  1  2  3  4  5

Puoi vedere qui che ci sono più possibilità di produrre alcuni numeri rispetto ad altri:bias. Per fortuna, l'intervallo effettivo del tipo Int è molto più grande... tanto che nella maggior parte dei casi la distorsione è quasi impercettibile. Tuttavia, è qualcosa di cui essere consapevoli se mai ti ritrovi a farlo per un codice di sicurezza serio.