Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie generiere ich eine Zufallszahl für jede Zeile in einer T-SQL-Auswahl?

Sehen Sie sich SQL Server - Set based random numbers an, das eine sehr detaillierte Erklärung enthält.

Zusammenfassend generiert der folgende Code eine Zufallszahl zwischen 0 und einschließlich 13 mit einer gleichmäßigen Verteilung:

ABS(CHECKSUM(NewId())) % 14
 

Um Ihren Bereich zu ändern, ändern Sie einfach die Zahl am Ende des Ausdrucks. Seien Sie besonders vorsichtig, wenn Sie einen Bereich benötigen, der sowohl positive als auch negative Zahlen enthält. Wenn Sie es falsch machen, ist es möglich, die Zahl 0 doppelt zu zählen.

Eine kleine Warnung für die Mathe-Freaks im Raum:Es gibt eine sehr leichte Verzerrung in diesem Code. CHECKSUM() führt zu Zahlen, die über den gesamten Bereich des sql Int-Datentyps einheitlich sind, oder zumindest so nahe, wie meine (der Editor) Tests zeigen können. Es wird jedoch eine gewisse Verzerrung geben, wenn CHECKSUM() eine Zahl am oberen Ende dieses Bereichs erzeugt. Jedes Mal, wenn Sie eine Zahl zwischen der maximal möglichen Ganzzahl und dem letzten exakten Vielfachen der Größe Ihres gewünschten Bereichs (in diesem Fall 14) vor dieser maximalen Ganzzahl erhalten, werden diese Ergebnisse gegenüber dem verbleibenden Teil Ihres Bereichs bevorzugt, der nicht erzeugt werden kann das letzte Vielfache von 14.

Stellen Sie sich beispielsweise vor, der gesamte Bereich des Int-Typs ist nur 19. 19 ist die größtmögliche Ganzzahl, die Sie halten können. Wenn CHECKSUM() 14-19 ergibt, entsprechen diese den Ergebnissen 0-5. Diese Zahlen wären stark gegenüber 6-13 bevorzugt, weil CHECKSUM() sie mit doppelt so hoher Wahrscheinlichkeit generiert. Es ist einfacher, dies visuell zu demonstrieren. Unten ist der gesamte mögliche Satz von Ergebnissen für unseren imaginären ganzzahligen Bereich:

Prüfsumme Ganzzahl:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Bereich Ergebnis:0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5 

Sie können hier sehen, dass es mehr Chancen gibt, einige Zahlen zu produzieren als andere:Voreingenommenheit. Glücklicherweise ist der tatsächliche Bereich des Int-Typs viel größer ... so sehr, dass die Verzerrung in den meisten Fällen fast nicht nachweisbar ist. Es ist jedoch etwas, dessen Sie sich bewusst sein sollten, wenn Sie dies jemals für ernsthaften Sicherheitscode tun.