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

Oracle SQL需求:忽略INVOICE_NO重复行,仅保留首行数据

Oracle SQL 优化:保留每个INVOICE_NO的首行结果

我编写的原始查询语句如下:

SELECT TRANSACTION_ID, INVOICE_NO, MOBILE_NO, ITEM_AMOUT
FROM INVOICE_DAILY_DTS
WHERE DAILY_DTS != 200 AND INVOICE_SAM = 12;

执行该查询后,返回结果中INVOICE_NO列存在大量重复数据,原始结果示例:

1) 11331133114, 154245, 077123456789, 579.5
2) 11331133114, 154245, 077123456789, 579.5
3) 11331133114, 154246, 077457852155, 780.4
4) 11331133114, 154245, 077123456789, 579.5
5) 11331133114, 154458, 077547822554, 900.0
6) 11331133114, 154245, 077123456789, 579.5
7) 11331133114, 154246, 077457852155, 780.4

期望得到的结果是每个INVOICE_NO仅保留第一行数据:

1) 11331133114, 154245, 077123456789, 579.5
2) 11331133114, 154246, 077457852155, 780.4
3) 11331133114, 154458, 077547822554, 900.0

优化后的查询语句

使用Oracle的ROW_NUMBER()窗口函数实现需求:

SELECT TRANSACTION_ID, INVOICE_NO, MOBILE_NO, ITEM_AMOUT
FROM (
    SELECT 
        TRANSACTION_ID, 
        INVOICE_NO, 
        MOBILE_NO, 
        ITEM_AMOUT,
        ROW_NUMBER() OVER (PARTITION BY INVOICE_NO ORDER BY NULL) AS rn
    FROM INVOICE_DAILY_DTS
    WHERE DAILY_DTS != 200 AND INVOICE_SAM = 12
) t
WHERE rn = 1;

说明

  • PARTITION BY INVOICE_NO:按INVOICE_NO分组,将相同编号的行归为一组
  • ORDER BY NULL:如果不需要指定特定排序规则确定"第一行",可使用ORDER BY NULL让数据库按默认顺序返回首行;若有明确排序依据(比如TRANSACTION_ID),替换为对应列名即可
  • 外层查询过滤rn = 1的行,仅保留每组的第一行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:50:20