SQL实现每n个GROUP类别分配对应GROUP_ID的方法
实现方案
核心逻辑是先对去重后的GROUP值排序并分配连续序号,再通过数学计算将每n个序号映射到同一个GROUP_ID,最后关联回原表即可,支持自定义每组包含的GROUP数量n。
注意事项
GROUP是SQL保留关键字,查询时需要用反引号(MySQL)或双引号(PostgreSQL/Oracle)包裹避免语法报错。
通用SQL实现(支持窗口函数的版本,适配MySQL 8.0+/PostgreSQL/Oracle等)
-- 自定义每组包含的GROUP数量,示例为2,可修改为任意正整数 SET @group_count_per_id = 2; WITH distinct_group_rn AS ( -- 给所有去重后的GROUP按顺序分配连续行号 SELECT `GROUP`, ROW_NUMBER() OVER (ORDER BY `GROUP`) AS rn FROM your_table_name GROUP BY `GROUP` ), group_id_mapping AS ( -- 每n个GROUP分配同一个GROUP_ID SELECT `GROUP`, CEIL(rn / @group_count_per_id) AS GROUP_ID FROM distinct_group_rn ) -- 关联回原表得到最终结果 SELECT m.GROUP_ID, t.`GROUP`, t.STUDENT, t.GRADE FROM your_table_name t INNER JOIN group_id_mapping m ON t.`GROUP` = m.`GROUP` ORDER BY m.GROUP_ID, t.`GROUP`;
无窗口函数兼容版本(适配MySQL 5.x等低版本)
SET @group_count_per_id = 2; SET @row_num = 0; SELECT m.GROUP_ID, t.`GROUP`, t.STUDENT, t.GRADE FROM your_table_name t INNER JOIN ( SELECT `GROUP`, CEIL((@row_num := @row_num + 1) / @group_count_per_id) AS GROUP_ID FROM ( SELECT DISTINCT `GROUP` FROM your_table_name ORDER BY `GROUP` ) AS t1 ) AS m ON t.`GROUP` = m.`GROUP` ORDER BY m.GROUP_ID, t.`GROUP`;
逻辑说明
- 不管原表中每个
GROUP对应的记录行数多少,都只会对去重后的GROUP值做分组映射,不会出现同一个GROUP对应多个GROUP_ID的问题 - 即使
GROUP值本身不连续,也会按排序后的顺序每n个分为一组,符合示例要求的1、2对应GROUP_ID=1,3、4对应GROUP_ID=2的规则 - 不需要修改表结构,纯查询即可实现需求,如需固化结果可以加
CREATE TABLE result AS前缀将结果存入新表
内容的提问来源于stack exchange,提问作者Gustavomoty
相关产品推荐
相关产品推荐

