如何在SQL中基于transaction列删除表内重复数据?
基于transaction列去除employee表重复数据的SQL解决方案
我有一张名为employee的数据表,表结构为(id, transaction, sales),具体数据如下:
id transaction sales 1100000000002493644 46414104026581005688 2.2400 1100000000003120288 46403360812820035967 2.2400 1100000000002493644 46414104026581005688 2.2400 3300000000002592894 46427351011280903808 2.2400 1100000000108772072 46498465013410865589 3.9800 1100000000002493644 46498465013410865909 3.2900
需求与问题
需要基于transaction列删除重复数据,尝试了以下SQL代码但未得到正确结果:
SELECT employee.*, DISTINCT(transaction) AS UNIQUE_TXN FROM employee AS employee INNER employee AS employee_1 ON employee.transaction= employee_1.transaction GROUP BY employee.*
期望输出如下:
id transaction sales 1100000000002493644 46414104026581005688 2.2400 1100000000003120288 46403360812820035967 2.2400 3300000000002592894 46427351011280903808 2.2400 1100000000108772072 46498465013410865589 3.9800 1100000000002493644 46498465013410865909 3.2900
原SQL的问题
- 语法错误:
INNER employee缺少JOIN关键字,正确写法应为INNER JOIN employee - 逻辑冗余:无需通过自连接实现去重,写法复杂且效率低
- 函数误用:
DISTINCT是对整个查询结果去重,不能单独作用于单个字段,DISTINCT(transaction)写法无意义
解决方案
方法1:使用DISTINCT直接去重
如果同一transaction对应的id和sales完全一致,直接用DISTINCT即可快速去重:
SELECT DISTINCT id, transaction, sales FROM employee;
方法2:使用窗口函数(适用于同一transaction存在不同id/sales的场景)
如果需要保留重复transaction中的某一行(例如最小id的记录),可以用ROW_NUMBER()窗口函数:
SELECT id, transaction, sales FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY transaction ORDER BY id) AS rn FROM employee ) t WHERE rn = 1;
PARTITION BY transaction:按交易号分组ORDER BY id:指定分组内的排序规则,这里选择保留id最小的记录,可根据需求修改为其他字段(如sales)- 筛选
rn = 1即可得到每组的第一条记录,实现去重
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

