查询 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;
我有一个 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;