Tek tek satırların rastgele bir örneğini gerçekten istiyorsanız, sorgunuzu TABLESAMPLE kullanmak yerine satırları rastgele filtreleyecek şekilde değiştirin. Örneğin, aşağıdaki sorgu, Sales.SalesOrderDetail tablosunun satırlarının yaklaşık yüzde birini döndürmek için NEWID işlevini kullanır:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
SalesOrderID sütunu CHECKSUM ifadesine dahil edilir, böylece NEWID () satır başına örnekleme elde etmek için her satırda bir değerlendirme yapar. CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) ifadesi, 0 ile 1 arasında rastgele bir kayan değer olarak değerlendirilir. "
Kaynak: http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx
Bu, aşağıda daha ayrıntılı açıklanmıştır:
Bu nasıl çalışıyor? WHERE cümlesini ayıralım ve açıklayalım.
CHECKSUM işlevi, listedeki öğeler üzerinde bir sağlama toplamı hesaplıyor. NEWID () yeni bir rastgele GUID döndüren bir işlev olduğundan, SalesOrderID'nin gerekli olup olmadığı tartışılabilir, bu nedenle rastgele bir rakamı bir sabitle çarpmak her durumda rastgele sonuçlanmalıdır. Gerçekten de SalesOrderID'nin hariç tutulması bir fark yaratmıyor gibi görünüyor. Eğer istekli bir istatistikçiyseniz ve bunun dahil edilmesini haklı çıkarabiliyorsanız, lütfen aşağıdaki yorumlar bölümünü kullanın ve neden yanıldığımı bana bildirin!
CHECKSUM işlevi bir VARBINARY döndürür. İkilide (111111111 ...) 'e eşdeğer olan 0x7fffffff ile bitsel AND işlemi gerçekleştirmek, 0'lar ve 1'lerden oluşan rastgele bir dizenin etkin bir şekilde temsili olan ondalık bir değer verir. Eş-verimli 0x7fffffff ile bölmek, bu ondalık rakamı 0 ile 1 arasındaki bir rakama etkili bir şekilde normalleştirir. Ardından, her bir satırın nihai sonuç kümesine dahil edilmeyi hak edip etmediğine karar vermek için, 1 / x'lik bir eşik kullanılır (bu durumda, 0,01) burada x, örnek olarak alınacak verilerin yüzdesidir.
Kaynak: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling