SQL如何按表中指定列取值选取等量的随机行
实现方案
思路说明
首先统计Col2列中0和1各自的行数,取两者的较小值作为两个分组的统一抽取行数,之后分别从0、1两个分组中随机抽取对应数量的行合并返回即可。如果需要直接修改原表删除多余行,只要标记出超出抽取数的随机行执行删除即可。
以你给出的示例表为例:Col2为1的行共2条,为0的行共3条,取最小值2,最终从0分组随机抽2行、1分组抽全部2行,刚好得到4条0和1数量相等的结果,和参考结果逻辑一致。
随机查询实现(不修改原表)
以常用的MySQL语法为例:
-- 计算0和1的最小行数 SET @min_count = ( SELECT MIN(group_count) FROM ( SELECT COUNT(*) AS group_count FROM your_table_name GROUP BY Col2 ) AS group_stats ); -- 分别随机抽取后合并结果 (SELECT * FROM your_table_name WHERE Col2 = 0 ORDER BY RAND() LIMIT @min_count) UNION ALL (SELECT * FROM your_table_name WHERE Col2 = 1 ORDER BY RAND() LIMIT @min_count);
不同数据库仅随机排序语法有差异:PostgreSQL替换RAND()为RANDOM(),SQL Server替换为NEWID()即可。
直接删除原表多余行实现
确认要修改原表的情况下,直接删除行数更多的分组中超出最小行数的随机行即可,以MySQL为例:
-- 先确定哪个分组行数更多,这里示例是0分组行数更多 DELETE FROM your_table_name WHERE Col2 = 0 ORDER BY RAND() LIMIT ( SELECT COUNT(*) - @min_count FROM your_table_name WHERE Col2 = 0 );
如果1分组行数更多,将WHERE条件中的Col2值改为1即可。
内容的提问来源于stack exchange,提问作者Mohsin
相关产品推荐
相关产品推荐

