Se desideri davvero un campione casuale di singole righe, modifica la query per filtrare le righe in modo casuale, invece di utilizzare TABLESAMPLE. Ad esempio, la query seguente utilizza la funzione NEWID per restituire circa l'uno percento delle righe della tabella Sales.SalesOrderDetail:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
La colonna SalesOrderID è inclusa nell'espressione CHECKSUM in modo che NEWID () valuti una volta per riga per ottenere il campionamento per riga. L'espressione CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) restituisce un valore float casuale compreso tra 0 e 1. "
Fonte: http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx
Questo è ulteriormente spiegato di seguito:
Come funziona? Dividiamo la clausola WHERE e la spieghiamo.
La funzione CHECKSUM sta calcolando un checksum sugli elementi nell'elenco. È discutibile se SalesOrderID sia addirittura richiesto, poiché NEWID () è una funzione che restituisce un nuovo GUID casuale, quindi moltiplicando una cifra casuale per una costante dovrebbe risultare in un caso casuale in ogni caso. In effetti, escludere SalesOrderID sembra non fare alcuna differenza. Se sei un appassionato di statistica e puoi giustificare l'inclusione di questo, usa la sezione commenti qui sotto e fammi sapere perché mi sbaglio!
La funzione CHECKSUM restituisce un VARBINARIO. L'esecuzione di un'operazione AND bit per bit con 0x7fffffff, che è l'equivalente di (111111111 ...) in binario, produce un valore decimale che è effettivamente una rappresentazione di una stringa casuale di 0 e 1. La divisione per il coefficiente 0x7fffffff normalizza efficacemente questa cifra decimale a una cifra compresa tra 0 e 1. Quindi per decidere se ciascuna riga merita di essere inclusa nel set di risultati finali, viene utilizzata una soglia di 1 / x (in questo caso, 0,01) dove x è la percentuale dei dati da recuperare come campione.
Fonte: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling