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

Hvordan genererer jeg et tilfældigt tal for hver række i en T-SQL-selektion?

Tag et kig på SQL Server - Sæt baseret tilfældige tal, som har en meget detaljeret forklaring.

For at opsummere genererer følgende kode et tilfældigt tal mellem 0 og 13 inklusive med en ensartet fordeling:

ABS(CHECKSUM(NewId())) % 14
 

For at ændre dit område skal du blot ændre tallet i slutningen af ​​udtrykket. Vær ekstra forsigtig, hvis du har brug for et interval, der indeholder både positive og negative tal. Hvis du gør det forkert, er det muligt at dobbelttælle tallet 0.

En lille advarsel til matematiknødderne i rummet:der er en meget lille skævhed i denne kode. CHECKSUM() resulterer i tal, der er ensartede over hele rækken af ​​sql Int-datatypen, eller i det mindste så tæt på, som min (redaktøren) test kan vise. Der vil dog være en vis skævhed, når CHECKSUM() producerer et tal i den øverste ende af dette interval. Hver gang du får et tal mellem det maksimalt mulige heltal og det sidste eksakte multiplum af størrelsen af ​​dit ønskede interval (14 i dette tilfælde) før det maksimale heltal, favoriseres disse resultater frem for den resterende del af dit interval, som ikke kan produceres fra det sidste multiplum af 14.

Forestil dig som et eksempel, at hele området for Int-typen kun er 19. 19 er det størst mulige heltal, du kan holde. Når CHECKSUM() resulterer i 14-19, svarer disse til resultaterne 0-5. Disse tal ville være tunge favoriseret frem for 6-13, fordi CHECKSUM() er dobbelt så sandsynligt, at de genererer dem. Det er nemmere at demonstrere dette visuelt. Nedenfor er hele det mulige sæt resultater for vores imaginære heltalsområde:

Tjeksum heltal:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Rangeresultat:0 1 2 3 4 5 6 7 8 9 10 11 12 12 13 

før>

Du kan se her, at der er flere chancer for at producere nogle tal end andre:bias. Heldigvis er den faktiske rækkevidde af Int-typen meget større... så meget, at skævheden i de fleste tilfælde er næsten uopdagelig. Det er dog noget, du skal være opmærksom på, hvis du nogensinde finder dig selv at gøre dette for seriøs sikkerhedskode.



  1. Sådan får du slutningen af ​​måneden i MariaDB

  2. psql:kunne ikke oprette forbindelse til server:Forbindelse nægtet Fejl ved forbindelse til fjerndatabase

  3. Hvorfor enhver lille virksomhed har brug for en database

  4. Opdel datointerval i én række om måneden i sql server