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
相关产品推荐
相关产品推荐

