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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:52:41