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
相关产品推荐
相关产品推荐

