选择具有唯一标识列的重复项

Posted

技术标签:

【中文标题】选择具有唯一标识列的重复项【英文标题】:Selecting duplicates with a unique identifying column 【发布时间】:2015-03-06 20:24:40 【问题描述】:

我有一个看起来像这样的表(简化)

|唯一标识 |值1 |值2 |值3 | |:--------:|:------:|:------:|:------:| | 1 |一个 |乙 | c | | 2 |电子| f |克 | | 3 |一个 |乙 | c | | 4 |一个 |乙 | c | | 5 |电子| f | g |

最终目标是获取具有相同 value1、value2 和 value3 但没有第一次出现的 uniqueID 列表。对于上面的表格,我希望查询的结果是:

|唯一标识 | |:--------:| | 3 | | 4 | | 5 |

这样我就可以稍后从表中删除这些唯一 ID。我当前的代码如下所示:

select value1, value2, value3, count(*)
from myTable
group by value1, value2, value3 having count(*) > 1;

这让我明白了:

|值1 |值2 |价值3 |计数(*)| |:------:|:------:|:------:|:--------:| |一个 |乙 | c | 3 | |电子| f |克 | 2 |

这很适合查看哪些值集是重复的,但不能帮助我识别它们的 uniqueID。

谢谢

【问题讨论】:

【参考方案1】:

你可以试试这样的:

SELECT uniqueID, value1, value2, value3 FROM (
    SELECT uniqueID, value1, value2, value3
         , ROW_NUMBER() OVER ( PARTITION BY value1, value2, value3 ORDER BY uniqueID ) AS rn
      FROM mytable
) WHERE rn > 1;

这将获得存在多个值的所有唯一值组合,并将消除第一个(通过过滤ROW_NUMBER() 的结果),其中“first”是该组合的uniqueID 的最小值。

如果您想获得那些您不想删除的,您可以改为执行以下操作:

SELECT uniqueID, value1, value2, value3 FROM (
    SELECT uniqueID, value1, value2, value3
         , ROW_NUMBER() OVER ( PARTITION BY value1, value2, value3 ORDER BY uniqueID ) AS rn
      FROM mytable
) WHERE rn = 1;

编辑:修正了一些标识符名称。确实,在 Oracle 中使用 CamelCase 和 headlessCamelCase 不是一个好主意,您的表名和列名将被转换为大写(除非您引用您的标识符)。

【讨论】:

谢谢 David Faber,这完美地回答了我的问题。这很有帮助。 CamelCase 也是一个旧习惯,但我使用的实际表具有 UNIQUE_ID 之类的名称。我写的例子只是名字不好。

以上是关于选择具有唯一标识列的重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何更新没有任何数据的行以唯一标识该行?

在具有标识列的表中插入 select from

是否可以在 MPMediaCollection 中唯一标识重复的 MPMediaItem?

sql2005中设置字段属性时,如何设标识列(自增1)和必须唯一

CA证书登录时出现:读取设备唯一标识符信息异常,请检查锁是不是插好。但是密码锁已经插上了。

唯一标识名称和大小相同但内容不同的文件