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

SQL多对一JOIN查询如何将重复字段值替换为空白(适配AWS Athena)

实现方案

通用思路

  • 核心逻辑是通过窗口函数给不同层级的分组做行号标记,仅在分组内第一行返回原值,其余行返回空值
  • 层级优先级从高到低为ticket_id > file_name > 自定义字段,高优先级字段值为空时,所有更低优先级的字段如果属于同一上级分组也按规则置空

AWS Athena(Presto SQL)实现代码

WITH base_data AS (
    -- 替换为你实际的三表关联查询逻辑
    SELECT 
        t.ticket_id,
        t.description,
        d.file_name,
        f.field_name,
        f.field_value
    FROM ticket t
    LEFT JOIN document d ON t.ticket_id = d.ticket_id
    LEFT JOIN flex_fields f ON t.ticket_id = f.ticket_id
),
ranked_data AS (
    SELECT 
        *,
        -- 按ticket_id分区,标记同工单下的行顺序
        ROW_NUMBER() OVER(PARTITION BY ticket_id ORDER BY file_name, field_name) AS rn_ticket,
        -- 按ticket_id+file_name分区,标记同工单同文件下的行顺序
        ROW_NUMBER() OVER(PARTITION BY ticket_id, file_name ORDER BY field_name) AS rn_file
    FROM base_data
)
SELECT 
    -- 仅同工单第一行返回ticket_id和description,其余返回空
    CASE WHEN rn_ticket = 1 THEN CAST(ticket_id AS VARCHAR) ELSE '' END AS ticket_id,
    CASE WHEN rn_ticket = 1 THEN description ELSE '' END AS description,
    -- 仅同工单同文件第一行返回file_name,其余返回空
    CASE WHEN rn_file = 1 THEN file_name ELSE '' END AS file_name,
    field_name,
    field_value
FROM ranked_data
-- 排序规则和窗口函数内的排序保持一致,可根据实际需求调整
ORDER BY ticket_id DESC, file_name, field_name;

注意事项

  • 所有窗口函数的ORDER BY逻辑要和最终结果的排序逻辑完全一致,否则会出现值显示位置不符合预期的问题
  • 因为ticket_id是数值类型,需要转成字符串类型才能和空字符串统一返回,否则会报类型不匹配错误
  • 该思路兼容所有支持窗口函数的主流数据库(MySQL 8.0+、PostgreSQL、SQL Server等),仅需根据对应数据库的语法调整类型转换函数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:06:03