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

Azure SQL(TSQL):分组查询中按索引提取Tag转为多列

Azure SQL TSQL实现分组拆分Tag为多列

问题描述

原始数据表:

MeasureId | Tag
----------------------
1         | CODE-ABC
1         | CODE-EFG
1         | CODE-HGT
2         | CODE-XXX
2         | CODE-YYY

已知每个MeasureId最多对应3个Tag,期望输出结构:

MeasureId | Tag1     | Tag2     | Tag3
--------------------------------------------
1         | CODE-ABC | CODE-EFG | CODE-HGT
2         | CODE-XXX | CODE-YYY | <null>

当前已通过STRING_AGG实现Tag合并,但需要将合并后的Tag拆分为独立列,询问该需求在Azure SQL中是否可行。

可行性及解决方案

该需求在Azure SQL的TSQL中完全可行,推荐两种高效实现方式,无需依赖字符串拆分:

方法一:窗口函数+条件聚合

先通过ROW_NUMBER()按MeasureId分组为每个Tag分配序号,再通过条件聚合将不同序号的Tag映射到对应列:

SELECT
    MeasureId,
    MAX(CASE WHEN rn = 1 THEN Tag END) AS Tag1,
    MAX(CASE WHEN rn = 2 THEN Tag END) AS Tag2,
    MAX(CASE WHEN rn = 3 THEN Tag END) AS Tag3
FROM (
    SELECT
        MeasureId,
        Tag,
        ROW_NUMBER() OVER(PARTITION BY MeasureId ORDER BY Tag) AS rn
    FROM Measures
) t
GROUP BY MeasureId

注:ORDER BY Tag可根据实际业务调整排序规则,比如按数据插入时间排序。

方法二:PIVOT行转列

利用TSQL内置的PIVOT操作符实现行转列,同样需要先为每个Tag分配序号:

SELECT
    MeasureId,
    [1] AS Tag1,
    [2] AS Tag2,
    [3] AS Tag3
FROM (
    SELECT
        MeasureId,
        Tag,
        ROW_NUMBER() OVER(PARTITION BY MeasureId ORDER BY Tag) AS rn
    FROM Measures
) t
PIVOT (
    MAX(Tag)
    FOR rn IN ([1], [2], [3])
) p

以上两种方法均能直接得到目标结果,性能优于先聚合再拆分字符串的方式,避免了字符串操作的额外开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:55:18