Jeśli naprawdę potrzebujesz losowej próbki pojedynczych wierszy, zmodyfikuj zapytanie, tak aby losowo odfiltrowywało wiersze, zamiast używać TABLESAMPLE. Na przykład poniższe zapytanie używa funkcji NEWID, aby zwrócić około jednego procentu wierszy tabeli Sales.SalesOrderDetail:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
Kolumna SalesOrderID jest uwzględniona w wyrażeniu CHECKSUM, dzięki czemu NEWID () oblicza wartość raz na wiersz, aby uzyskać próbkowanie na podstawie każdego wiersza. Wyrażenie CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) zwraca losową wartość typu float z przedziału od 0 do 1. ”
Źródło: http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx
Jest to dokładniej wyjaśnione poniżej:
Jak to działa? Podzielmy klauzulę WHERE i wyjaśnijmy to.
Funkcja SUMA KONTROLNA oblicza sumę kontrolną pozycji na liście. Można spierać się, czy SalesOrderID jest w ogóle wymagany, ponieważ NEWID () jest funkcją, która zwraca nowy losowy identyfikator GUID, więc pomnożenie losowej liczby przez stałą powinno w każdym przypadku skutkować losowością. Rzeczywiście, wykluczenie SalesOrderID wydaje się nie robić różnicy. Jeśli jesteś zapalonym statystykiem i potrafisz uzasadnić uwzględnienie tego, skorzystaj z sekcji komentarzy poniżej i daj mi znać, dlaczego się mylę!
Funkcja CHECKSUM zwraca wartość VARBINARY. Wykonywanie bitowej operacji AND z 0x7fffffff, co jest odpowiednikiem (111111111 ...) w systemie binarnym, daje wartość dziesiętną, która jest w rzeczywistości reprezentacją losowego ciągu zer i jedynek. Dzielenie przez współczynnik 0x7fffffff skutecznie normalizuje tę liczbę dziesiętną do liczby od 0 do 1. Następnie, aby zdecydować, czy każdy wiersz zasługuje na włączenie do końcowego zestawu wyników, stosuje się próg 1 / x (w tym przypadku 0,01), gdzie x to procent danych do pobrania jako próbka.
Źródło: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling