You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure Data Factory动态生成分组序号式新列的技术问题

实现方法

要完成这种长表转宽表的需求,核心是先给每个分组内的行添加序号,再通过条件聚合或动态SQL实现列的动态生成,以下是具体步骤:

1. 生成组内序号

先通过窗口函数ROW_NUMBER(),按id和group分组,给每组内的行分配序号(序号顺序可根据需求调整,示例按stock降序排列):

SELECT 
    id,
    `group`, -- group是SQL关键字,需用反引号转义
    stock,
    stockplace,
    ROW_NUMBER() OVER (PARTITION BY id, `group` ORDER BY stock DESC) AS rn
FROM your_table;

执行后得到中间结果:

id, group, stock, stockplace, rn
1, A, 30, X, 1
1, A, 20, Y, 2
1, A, 10, Z, 3
1, B, 10, AAA, 1
1, B, 5, EEE, 2

2. 静态条件聚合转宽表

如果分组和每组的行数固定,可以直接用MAX(CASE...)做条件聚合,把行转成列:

SELECT 
    id,
    -- 处理A组的列
    MAX(CASE WHEN `group` = 'A' AND rn = 1 THEN stock END) AS stockA1,
    MAX(CASE WHEN `group` = 'A' AND rn = 1 THEN stockplace END) AS stockplaceA1,
    MAX(CASE WHEN `group` = 'A' AND rn = 2 THEN stock END) AS stockA2,
    MAX(CASE WHEN `group` = 'A' AND rn = 2 THEN stockplace END) AS stockplaceA2,
    MAX(CASE WHEN `group` = 'A' AND rn = 3 THEN stock END) AS stockA3,
    MAX(CASE WHEN `group` = 'A' AND rn = 3 THEN stockplace END) AS stockplaceA3,
    -- 处理B组的列
    MAX(CASE WHEN `group` = 'B' AND rn = 1 THEN stock END) AS stockB1,
    MAX(CASE WHEN `group` = 'B' AND rn = 1 THEN stockplace END) AS stockplaceB1,
    MAX(CASE WHEN `group` = 'B' AND rn = 2 THEN stock END) AS stockB2,
    MAX(CASE WHEN `group` = 'B' AND rn = 2 THEN stockplace END) AS stockplaceB2
FROM (
    SELECT 
        id,
        `group`,
        stock,
        stockplace,
        ROW_NUMBER() OVER (PARTITION BY id, `group` ORDER BY stock DESC) AS rn
    FROM your_table
) t
GROUP BY id;

执行后就能得到你需要的目标结果。

3. 动态SQL实现通用转宽表

如果分组(如A、B)或每组的行数不固定,需要用动态SQL自动生成列:
以MySQL为例,代码如下:

-- 拼接动态SQL语句
SET @sql = NULL;
SELECT GROUP_CONCAT(
    DISTINCT CONCAT(
        'MAX(CASE WHEN `group` = ''', `group`, ''' AND rn = ', rn, ' THEN stock END) AS stock', `group`, rn,
        ', MAX(CASE WHEN `group` = ''', `group`, ''' AND rn = ', rn, ' THEN stockplace END) AS stockplace', `group`, rn
    )
) INTO @sql
FROM (
    SELECT `group`, ROW_NUMBER() OVER (PARTITION BY id, `group` ORDER BY stock DESC) AS rn
    FROM your_table
) t;

-- 组装完整SQL并执行
SET @sql = CONCAT('SELECT id, ', @sql, ' FROM (SELECT id, `group`, stock, stockplace, ROW_NUMBER() OVER (PARTITION BY id, `group` ORDER BY stock DESC) AS rn FROM your_table) t GROUP BY id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这段代码会自动识别所有分组和每组的行数,动态生成对应的列,适配不同的数据结构。

内容的提问来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:27:24