You need to enable JavaScript to run this app. SQL实现每n个GROUP类别分配对应GROUP_ID的方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 14:45:10