Tsql SQL-按组随机抽样5%

Tsql SQL-按组随机抽样5%,tsql,random-sample,newid,Tsql,Random Sample,Newid,我有一个表,大约有1000万行和4列,没有主键。第2列、第3列、第4列、第x2列、第x3列和第x4列中的数据按第1列、第X1列中确定的50组进行分组 为了从表中随机抽取5%的样本,我一直使用 SELECT TOP 5 PERCENT * FROM thistable ORDER BY NEWID() 结果返回大约500000行。但是,如果以这种方式进行抽样,某些群体在样本中的代表性相对于其原始规模是不平等的 这一次,为了获得更好的样本,我想从列X1中确定的50个组中的每个组中获得5%的样本。因

我有一个表,大约有1000万行和4列,没有主键。第2列、第3列、第4列、第x2列、第x3列和第x4列中的数据按第1列、第X1列中确定的50组进行分组

为了从表中随机抽取5%的样本,我一直使用

SELECT TOP 5 PERCENT *
FROM thistable
ORDER BY NEWID()
结果返回大约500000行。但是,如果以这种方式进行抽样,某些群体在样本中的代表性相对于其原始规模是不平等的

这一次,为了获得更好的样本,我想从列X1中确定的50个组中的每个组中获得5%的样本。因此,在最后,我可以得到X1中50个组中每个组5%的行的随机样本,而不是整个表的5%


我如何处理这个问题?多谢各位

您需要能够对每个组进行计数,然后以随机顺序强制输出数据。第四,我们可以使用CTE样式的查询来实现这一点。虽然CTE不是严格需要的,但它将有助于将解决方案分解为小块,而不是大量的子选择等等

我假设您已经有了一个对数据进行分组的列,并且该列中的值对于该组中的所有项都是相同的。如果是这样,类似这样的操作可能会改变列和表名以适应您的情况:

WITH randomID AS (
    -- First assign a random ID to all rows. This will give us a random order.
    SELECT *, NEWID() as random FROM sourceTable
),
countGroups AS (
    -- Now we add row numbers for each group. So each group will start at 1. We order 
    -- by the random column we generated in the previous expression, so you should get
    -- different results in each execution
    SELECT *, ROW_NUMBER() OVER (PARTITION BY groupcolumn ORDER BY random) AS rowcnt FROM randomID
)
-- Now we get the data
SELECT * 
    FROM countGroups c1
    WHERE rowcnt <= (
        SELECT MAX(rowcnt) / 20 FROM countGroups c2 WHERE c1.groupcolumn = c2.groupcolumn
    )

这两个CTE表达式允许您随机排序,然后对每组进行计数。最后的选择应该相当简单:对于每个组,找出其中有多少行,只返回其中的5%合计行数/20。

这非常有效。我曾尝试使用NTILE来实现这一点,但失败了,但这种CTE方法非常有意义。