如何在Snowflake中从数据表抽取10%的样本数据
Snowflake 按固定间隔抽取10%样本的实现方法
核心逻辑是先对表完成排序后生成连续行号,再筛选行号为10的倍数的行,正好对应你要的第10、20、30...行的需求。
实现代码
WITH sorted_table AS ( SELECT *, -- 按指定字段排序后生成连续行号 ROW_NUMBER() OVER (ORDER BY 你的排序字段1, 你的排序字段2) AS row_num FROM 你的目标表名 ) SELECT * EXCLUDE row_num FROM sorted_table -- 筛选行号为10的倍数的行 WHERE MOD(row_num, 10) = 0;
如果你使用的Snowflake版本不支持
EXCLUDE语法,把SELECT * EXCLUDE row_num改为手动列出你需要返回的所有字段即可。
参数替换说明
- 替换
你的排序字段1, 你的排序字段2为实际排序依据字段,建议包含主键等唯一值字段,保证排序结果稳定,每次抽样结果可复现 - 替换
你的目标表名为待抽样的表完整路径(如果有库、schema前缀需要一并带上) - 若需调整抽样比例,修改
MOD(row_num, 10)的第二个参数即可:抽取5%样本改为MOD(row_num, 20) = 0,抽取2%样本改为MOD(row_num, 50) = 0
注意事项
即使是超大数据量的表,该方案也可以正常运行,Snowflake的窗口函数ROW_NUMBER已经针对大表做了完善的性能优化,不需要额外做适配调整。
内容的提问来源于stack exchange,提问作者Vivek Sharma
相关产品推荐
相关产品推荐

