我希望在Microsoft SQL Server 2012中执行与How to select random IDs and all transactions within those random IDs in SQL类似的操作。 我非常大的主表有个人和月份的旅行记录:
FileDate PersID Location...
200001 1 A
200001 2 B
200001 3 A
200002 1 C
200002 2 C
200003 1 D
200004 1 A
主表中大约有2.6亿行,大约有420万行唯一的PersID。
首先,我试图返回唯一PersID的随机样本。我尝试过很多东西,其中最简单的就是
SELECT distinct PersID FROM mastertbl
TABLESAMPLE (1 percent);
我还尝试包装" SELECT distinct PersID"查询作为另一个查询中的子查询并在外部查询中应用TABLESAMPLE。
我的所有尝试都返回了大约170万行,这是唯一PersID的40%,而不是1%。这让我怀疑我的抽样方法是对主表格进行抽样,然后应用不同的标准,但我无法弄清楚如何修复它。
答案 0 :(得分:0)
来自the docs的一些相关引用:
TABLESAMPLE无法应用于派生表
所以子查询的事情是禁止的。
和
如果您确实需要单个行的随机样本,请修改您的查询以随机过滤掉行,而不是使用TABLESAMPLE。例如,以下查询使用NEWID函数返回Sales.SalesOrderDetail表的大约百分之一的行:
SELECT * FROM Sales.SalesOrderDetail WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
看起来您需要使用第二个引文中演示的技术,例如:
select * from (
select distinct id from mastertbl
) x
where 0.01 >= cast(checksum(newid(), id) & 0x7fffffff AS float) / cast(0x7fffffff AS int)