Якщо ви дійсно хочете випадкову вибірку окремих рядків, змініть свій запит, щоб випадково відфільтрувати рядки, замість того, щоб використовувати TABLESAMPLE. Наприклад, наступний запит використовує функцію NEWID для повернення приблизно одного відсотка рядків таблиці Sales.SalesOrderDetail:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
Стовпець SalesOrderID включено у вираз CHECKSUM, щоб NEWID () обчислював один раз на рядок для досягнення вибірки на основі кожного рядка. Вираз CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) обчислюється випадковим значенням плаваючого значення від 0 до 1. "
Джерело: http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx
Це додатково пояснюється нижче:
Як це працює? Давайте розділимо речення WHERE і пояснимо це.
Функція CHECKSUM обчислює контрольну суму над елементами у списку. Можна сперечатися щодо того, чи взагалі потрібен SalesOrderID, оскільки NEWID () - це функція, яка повертає новий випадковий GUID, тому множення випадкової цифри на константу в будь-якому випадку має призвести до випадкового. Дійсно, виключення SalesOrderID, здається, не має ніякої різниці. Якщо ви захоплений статистик і можете виправдати включення цього, скористайтесь розділом коментарів нижче та повідомте мені, чому я помиляюся!
Функція CHECKSUM повертає VARBINARY. Виконання побітової операції І з 0x7fffffff, що є еквівалентом (111111111 ...) у двійковому вигляді, дає десяткове значення, яке фактично є поданням випадкового рядка 0 і 1. Поділ на коефіцієнт 0x7fffffff ефективно нормалізує цю десяткову цифру до цифри від 0 до 1. Потім, щоб вирішити, чи заслуговує кожен рядок включення в кінцевий набір результатів, використовується поріг 1 / x (у даному випадку 0,01), де x - відсоток даних, які потрібно отримати як зразок.
Джерело: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling