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

时间:2015-03-06 20:24:41

标签: sql oracle

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

| uniqueID | value1 | value2 | value3 |
|:--------:|:------:|:------:|:------:|
|     1    |    a   |    b   |    c   |
|     2    |    e   |    f   |    g   |
|     3    |    a   |    b   |    c   |
|     4    |    a   |    b   |    c   |
|     5    |    e   |    f   |    g   |

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

| uniqueID |
|:--------:|
|     3    |
|     4    |
|     5    |

这样我就可以在以后从表中删除那些唯一ID。我目前的代码如下:

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

这让我:

| value1 | value2 | value3 | count(*) |
|:------:|:------:|:------:|:--------:|
|    a   |    b   |    c   |     3    |
|    e   |    f   |    g   |     2    |

哪个值很重要,可以看到哪些值重复,但无法帮助我识别它们的唯一ID。

由于

1 个答案:

答案 0 :(得分: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并不是一个好主意,你的表名和列名只会转换为大写(除非你引用你的标识符。)