提取唯一ID,然后获取与这些唯一ID的随机样本匹配的所有行

时间:2016-06-30 21:23:27

标签: sql-server random

我希望在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%。这让我怀疑我的抽样方法是对主表格进行抽样,然后应用不同的标准,但我无法弄清楚如何修复它。

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)