选择具有唯一标识列的重复项
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 之类的名称。我写的例子只是名字不好。以上是关于选择具有唯一标识列的重复项的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 MPMediaCollection 中唯一标识重复的 MPMediaItem?
sql2005中设置字段属性时,如何设标识列(自增1)和必须唯一