在Azure Synapse Analytics SparkSQL中按ID取字符最长的名称
解决方案:处理MEMBERS表重复ID保留最长名称及相关问题
一、核心需求:每个ID保留字符最长的名称记录
你的原代码存在两处问题:一是部分SQL方言不支持LEN()函数,二是排名未按ID分区,导致所有记录统一排序。修改后的可用代码如下:
WITH RANKEDROWS AS ( SELECT ID, NAME, RANK() OVER (PARTITION BY ID ORDER BY LENGTH(NAME) DESC) AS ROWRANK FROM MEMBERS ) SELECT ID, NAME FROM RANKEDROWS WHERE ROWRANK = 1;
关键调整:
- 替换
LEN()为LENGTH()(适配Hive、Spark SQL、MySQL等多数环境;若使用SQL Server,可换回LEN(),但必须保留PARTITION BY ID) - 排名窗口新增
PARTITION BY ID,确保每个ID内部单独排序,仅保留该ID下名称最长的记录
二、拆分名称为多列而非多行
使用explode()会将拆分后的数组转为多行,若要生成姓氏、名字独立列,直接取拆分数组的索引即可:
SELECT ID, TRIM(split(NAME, ',')[0]) AS LAST_NAME, -- 提取逗号前的姓氏部分,TRIM去除前后空格 TRIM(split(NAME, ',')[1]) AS FIRST_NAME -- 提取逗号后的名字部分,TRIM去除前后空格 FROM MEMBERS;
说明:
split(NAME, ',')将名称按逗号拆分为数组,[0]对应姓氏(含后缀如JR),[1]对应名字(含中间名缩写如A)TRIM()用于清理拆分后元素自带的前后空格,避免出现Carl A这类带空格的结果
内容的提问来源于stack exchange,提问作者Denise
相关产品推荐
相关产品推荐

