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

如何在SQL视图中对Invoice ID列进行唯一值过滤?

解决SQL视图中Invoice ID重复的问题

为什么DISTINCT没用?

DISTINCT是对整行所有列做去重判断,只要其他列(比如金额、创建时间)有任何差异,哪怕Invoice ID相同,整行也会被判定为不同记录保留下来,这就是你用了DISTINCT却没去掉重复Invoice ID的核心原因。

具体解决方案

  • 只保留唯一Invoice ID(无需其他列)
    如果视图只需要Invoice ID的唯一值,直接只查询这一列就行,两种写法都可以:

    -- 写法1:用DISTINCT
    SELECT DISTINCT InvoiceID
    FROM 你的视图基表或原视图;
    
    -- 写法2:用GROUP BY
    SELECT InvoiceID
    FROM 你的视图基表或原视图
    GROUP BY InvoiceID;
    
  • 需要保留其他列时筛选唯一行
    如果还要保留Invoice ID对应的其他列数据,得明确指定保留重复ID中的哪一行(比如最新创建的、金额最大的),用窗口函数ROW_NUMBER()是最灵活的方式:

    WITH RankedInvoices AS (
        SELECT 
            *,
            -- 按Invoice ID分组,每组内按创建时间倒序排序,给行打序号
            ROW_NUMBER() OVER (PARTITION BY InvoiceID ORDER BY 创建时间 DESC) AS rn
        FROM 你的视图基表或原视图
    )
    -- 只取每组序号为1的行(也就是最新的那一行)
    SELECT *
    FROM RankedInvoices
    WHERE rn = 1;
    

    把ORDER BY 创建时间 DESC换成你需要的逻辑就行,比如ORDER BY Amount DESC取金额最大的行,或者其他业务相关的列。

  • 检查视图的关联逻辑
    如果你的视图是多表JOIN出来的重复,大概率是关联条件不严谨导致了笛卡尔积(比如一对多关联时没限制好关联字段),得核对JOIN的条件是否正确,避免不必要的行倍增。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:02:10