Sif*_*har 6 t-sql random-sample newid
我有一个大约1000万行和4列的表,没有主键.第2列3 4(x2 x3和x4)中的数据按第1列X1中标识的50个组进行分组.
为了从表中获得5%的随机样本,我一直使用
SELECT TOP 5 PERCENT *
FROM thistable
ORDER BY NEWID()
Run Code Online (Sandbox Code Playgroud)
结果返回大约500,000行.但是,如果以这种方式采样,一些组在样本中得到不相等的表示(相对于它们的原始大小).
这次,为了获得更好的样本,我想从列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
)
Run Code Online (Sandbox Code Playgroud)
两个CTE表达式允许您随机排序,然后计算每个组.最后的选择应该相当简单:对于每个组,找出其中有多少行,并且只返回其中的5%(total_row_count_in_group/20).
| 归档时间: |
|
| 查看次数: |
4898 次 |
| 最近记录: |