sql >> Databasteknik >  >> RDS >> Sqlserver

Hur genererar jag ett slumptal för varje rad i ett T-SQL-val?

Ta en titt på SQL Server - Set-baserade slumptal som har en mycket detaljerad förklaring.

För att sammanfatta genererar följande kod ett slumptal mellan 0 och 13 inklusive med en enhetlig fördelning:

ABS(CHECKSUM(NewId())) % 14
 

För att ändra ditt intervall, ändra bara numret i slutet av uttrycket. Var extra försiktig om du behöver ett intervall som innehåller både positiva och negativa tal. Om du gör fel är det möjligt att dubbelräkna siffran 0.

En liten varning för matematiknötterna i rummet:det finns en mycket liten bias i den här koden. CHECKSUM() resulterar i siffror som är enhetliga över hela intervallet av sql Int-datatypen, eller åtminstone så nära som min (redaktörens) testning kan visa. Det kommer dock att finnas en viss bias när CHECKSUM() producerar ett tal längst upp i det intervallet. Varje gång du får ett tal mellan det högsta möjliga heltal och den sista exakta multipeln av storleken på ditt önskade intervall (14 i det här fallet) före det maximala heltal, gynnas dessa resultat framför den återstående delen av ditt intervall som inte kan produceras från den sista multipeln av 14.

Som ett exempel, föreställ dig att hela intervallet för Int-typen bara är 19. 19 är det största möjliga heltal du kan hålla. När CHECKSUM() resulterar i 14-19, motsvarar dessa resultaten 0-5. Dessa siffror skulle vara tunga favoriserad framför 6-13, eftersom det är dubbelt så stor sannolikhet att CHECKSUM() genererar dem. Det är lättare att visa detta visuellt. Nedan är hela möjliga uppsättning resultat för vårt imaginära heltalsområde:

Kontrollsumma heltal:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Omfångsresultat:0 1 2 3 4 5 6 7 8 9 10 11 12 12 13  

Du kan se här att det finns fler chanser att producera vissa siffror än andra:bias. Tack och lov är det faktiska intervallet för Int-typen mycket större... så mycket att fördomen i de flesta fall nästan inte går att upptäcka. Det är dock något att vara medveten om om du någonsin kommer på dig själv att göra detta för seriös säkerhetskod.



  1. Ska en databasanslutning vara öppen hela tiden eller bara öppnas när det behövs?

  2. JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() i SQLite

  3. Hur kan jag ändra en primärnyckelbegränsning med SQL-syntax?

  4. Hur Mod() fungerar i PostgreSQL