我有一个看起来像这样的表(简化)
| 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。
由于
答案 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并不是一个好主意,你的表名和列名只会转换为大写(除非你引用你的标识符。)