Nếu bạn thực sự muốn một mẫu ngẫu nhiên của các hàng riêng lẻ, hãy sửa đổi truy vấn của bạn để lọc ra các hàng một cách ngẫu nhiên, thay vì sử dụng TABLESAMPLE. Ví dụ: truy vấn sau sử dụng hàm NEWID để trả về khoảng một phần trăm các hàng của bảng Sales.SalesOrderDetail:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
Cột SalesOrderID được bao gồm trong biểu thức CHECKSUM để NEWID () đánh giá một lần mỗi hàng để đạt được lấy mẫu trên cơ sở mỗi hàng. Biểu thức CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) cho giá trị thực ngẫu nhiên trong khoảng từ 0 đến 1. "
Nguồn: http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx
Điều này được giải thích thêm bên dưới:
Cái này hoạt động ra sao? Hãy tách mệnh đề WHERE và giải thích nó.
Hàm CHECKSUM đang tính tổng tổng cho các mục trong danh sách. Người ta vẫn tranh cãi về việc liệu SalesOrderID có được yêu cầu hay không, vì NEWID () là một hàm trả về một GUID ngẫu nhiên mới, do đó, nhân một số ngẫu nhiên với một hằng số sẽ dẫn đến ngẫu nhiên trong mọi trường hợp. Thật vậy, việc loại trừ SalesOrderID dường như không có gì khác biệt. Nếu bạn là một nhà thống kê nhạy bén và có thể biện minh cho việc đưa vào điều này, vui lòng sử dụng phần nhận xét bên dưới và cho tôi biết tại sao tôi sai!
Hàm CHECKSUM trả về một VARBINARY. Thực hiện phép toán theo chiều bit AND với 0x7fffffff, tương đương với (111111111 ...) trong hệ nhị phân, mang lại giá trị thập phân là biểu diễn của một chuỗi ngẫu nhiên gồm 0 và 1s. Chia cho 0x7fffffff đồng thời chuẩn hóa hiệu quả con số thập phân này thành một con số từ 0 đến 1. Sau đó, để quyết định xem mỗi hàng có xứng đáng được đưa vào tập kết quả cuối cùng hay không, ngưỡng 1 / x được sử dụng (trong trường hợp này là 0,01) trong đó x là phần trăm dữ liệu cần lấy làm mẫu.
Nguồn: https://www.mssqltips.com/sqlservertip/3157/dierence-ways-to-get-random-data-for-sql-server-data-sampling