查询 Oracle 数据库中的重复行

Querying duplicate rows within Oracle Database

我有一个 table 看起来像这样。

|  File_ID  |   MD5 Sum   |  File Size  |
| --------- | ----------- | ----------- |
|   140532  |  10000000   |    3000     |
|   192348  |  11111111   |    4000     |
|   223292  |  22222222   |    4000     |
|   272364  |  11111111   |    4000     |
|   223045  |  10000000   |    3000     |

我想看看有多少 space 被重复文件浪费了。问题在于这些重复文件具有唯一的主键 (file_id)。我们知道我们有重复项,因为 count(distinct MD5 sum) != count(*)

我想写一个查询 return 总共 space 被重复文件使用。在此示例中,查询将 return 7000,因为文件 ID 为 272364 和 223045 的行是重复的。

如果有人能帮我解决这个问题,我将不胜感激。

您可以使用 MD5 生成行号,然后任何重复项都会显示行号大于 1 的行号。

例如:

select sum(file_size)
from (
  select t.*, row_number() over(partition by md5_sum order by file_id) as rn
  from t
) x
where rn > 1

The Impaler 建议的替代方法。但我承认我更喜欢他们的方法:-)

按 MD5 总和分组并查看具有多个条目的那些。然后从文件大小的总和中减去一个文件大小以获得多余部分。最后将所有这些文件的多余金额加起来。

select sum(excess) as total
from
(
  select md5, sum(filesize) - min(filesize) as excess
  from mytable
  group by md5
  having count(*) > 1
) excess_per_file;