Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wygenerować losową liczbę dla każdego wiersza w zaznaczeniu T-SQL?

Rzuć okiem na SQL Server — oparte na zestawach liczb losowych, które mają bardzo szczegółowe wyjaśnienie.

Podsumowując, poniższy kod generuje losową liczbę z przedziału od 0 do 13 włącznie z jednorodnym rozkładem:

ABS(CHECKSUM(NewId())) % 14

Aby zmienić zakres, po prostu zmień liczbę na końcu wyrażenia. Zachowaj szczególną ostrożność, jeśli potrzebujesz zakresu, który zawiera zarówno liczby dodatnie, jak i ujemne. Jeśli zrobisz to źle, możliwe jest podwójne policzenie liczby 0.

Małe ostrzeżenie dla maniaków matematyki w pokoju:w tym kodzie jest bardzo drobna stronniczość. CHECKSUM() wyniki w liczbach, które są jednolite w całym zakresie typu danych sql Int, lub przynajmniej tak blisko, jak pokazują moje (edytora) testy. Jednak będzie pewne odchylenie, gdy CHECKSUM() wygeneruje liczbę na samym górnym końcu tego zakresu. Za każdym razem, gdy otrzymasz liczbę między maksymalną możliwą liczbą całkowitą a ostatnią dokładną wielokrotnością rozmiaru żądanego zakresu (w tym przypadku 14) przed tą maksymalną liczbą całkowitą, te wyniki są uprzywilejowane w stosunku do pozostałej części zakresu, której nie można uzyskać z ta ostatnia wielokrotność 14.

Jako przykład wyobraź sobie, że cały zakres typu Int wynosi tylko 19. 19 to największa możliwa liczba całkowita, jaką możesz pomieścić. Gdy CHECKSUM() daje 14-19, odpowiadają one wynikom 0-5. Te liczby byłyby ciężkie uprzywilejowane nad 6-13, ponieważ CHECKSUM() ma dwa razy większe szanse na ich wygenerowanie. Łatwiej jest to zademonstrować wizualnie. Poniżej znajduje się cały możliwy zestaw wyników dla naszego urojonego zakresu liczb całkowitych:

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

Widać tutaj, że istnieje więcej szans na wytworzenie niektórych liczb niż innych:stronniczość. Na szczęście rzeczywisty zakres typu Int to dużo większy... tak bardzo, że w większości przypadków błąd jest prawie niewykrywalny. Jest to jednak coś, o czym należy pamiętać, jeśli kiedykolwiek zrobisz to dla poważnego kodu zabezpieczającego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wywołaj procedurę składowaną z parametrem w c#

  2. HAS_DBACCESS() – Dowiedz się, czy użytkownik może uzyskać dostęp do bazy danych w SQL Server

  3. Dynamiczne maskowanie danych w SQL Server dla zaawansowanych użytkowników

  4. Jak wyświetlić wszystkie domyślne ograniczenia z kolumnami w bazie danych SQL Server — samouczek SQL Server/TSQL — część 92

  5. Jak zaplanować codzienne uruchamianie zapytania SQL?