如何在SQL中使用TABLESAMPLE实现每个分组抽样10行数据
SQL分组抽样实现说明
TABLESAMPLE写法不支持的核心原因
TABLESAMPLE是表级别的抽样语法,执行时机早于分组、窗口计算等逻辑阶段,只能作用于整表或物理分片,无法识别partition by定义的逻辑分组边界,SQL标准本身就不支持将TABLESAMPLE嵌套在窗口函数OVER()的分区规则中,因此你编写的语句无法正常运行。
分组抽样通用实现方案
无需使用TABLESAMPLE的跨数据库兼容实现如下,逻辑为每个分组内对所有行随机排序后取前10条,适配PostgreSQL、Spark SQL、Hive、MySQL 8.0+等所有支持窗口函数的数据库:
select * from ( select *, rank() over (partition by 分组字段 order by random()) as rk from 表名 ) t where rk <= 10;
注意:不同数据库的随机函数可做对应替换,例如SQL Server替换
random()为newid(),Oracle替换为dbms_random.value即可。
内容的提问来源于stack exchange,提问作者safetyduck
相关产品推荐
相关产品推荐

