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

如何在Oracle SQL中将同报告同年度重复数据拆分为多列展示

Oracle SQL 实现同报告同年度重复数据同行展示

需求:查询同一份报告、同一年度内的重复数据,将重复数据以额外列的形式合并到同一行中,且每个报告对应的重复数据最多1条。

当前查询能筛选出存在重复的记录,但无法将同报告的两条记录合并为一行。以下是实现目标格式的方案:

解决方案思路

利用窗口函数ROW_NUMBER()为每个报告+年度分组内的记录分配序号,再通过自连接将序号1(主记录)和序号2(重复记录)的字段合并到同一行。

具体SQL语句

WITH ranked_data AS (
    SELECT 
        ID_PPAL_ICI AS report,
        BLNC_ID AS id_tip,
        BLNC_FEC_CIERRE AS date,
        BLNC_DUR AS duration,
        ID_PPAL_FNT AS source,
        BLNC_TIP AS tip,
        -- 按报告+年度分组,给每条记录分配序号,最新日期排第1
        ROW_NUMBER() OVER (
            PARTITION BY ID_PPAL_ICI, EXTRACT(YEAR FROM BLNC_FEC_CIERRE)
            ORDER BY BLNC_FEC_CIERRE DESC
        ) AS rn
    FROM BLNC_BALANCES
    INNER JOIN ID_PPAL ON BLNC_ID_PPAL_ICI = ID_PPAL_ICI
)
SELECT 
    r1.report,
    r1.id_tip,
    r1.date,
    r1.duration,
    r1.source,
    r1.tip,
    r2.id_tip AS id_tip_1,
    r2.date AS date_1,
    r2.duration AS duration_1,
    r2.source AS source_1,
    r2.tip AS tip_1
FROM ranked_data r1
LEFT JOIN ranked_data r2 
    ON r1.report = r2.report
    AND EXTRACT(YEAR FROM r1.date) = EXTRACT(YEAR FROM r2.date)
    AND r1.rn = 1
    AND r2.rn = 2
WHERE r1.rn = 1; -- 只取每个组的主记录,合并重复记录作为附属列

语句说明

  1. CTE ranked_data:给每个报告+年度内的记录按日期降序分配序号rn,序号1对应最新记录,序号2对应同组内的重复记录(因每个报告最多1条重复)。
  2. 自连接:将主记录(rn=1)和重复记录(rn=2)通过报告、年度关联,把重复记录的字段重命名为带_1后缀的列。
  3. WHERE条件:只保留主记录行,确保每行对应一条报告的主记录+其关联的重复数据列。

执行该语句后,即可得到你期望的格式:同一行中同时展示主记录和对应的重复数据列。

内容的提问来源于stack exchange,提问作者Al.Vioky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:43:19