我有一張看起來像這樣的桌子。
| File_ID | MD5 Sum | File Size |
| --------- | ----------- | ----------- |
| 140532 | 10000000 | 3000 |
| 192348 | 11111111 | 4000 |
| 223292 | 22222222 | 4000 |
| 272364 | 11111111 | 4000 |
| 223045 | 10000000 | 3000 |
我想看看重復檔案浪費了多少空間。問題是這些重復檔案具有唯一的主鍵(file_id)。我們知道我們有重復,因為 count(distinct MD5 sum) != count(*)
我想撰寫一個查詢,回傳重復檔案使用的總空間。在此示例中,查詢將回傳 7000,因為檔案 ID 為 272364 和 223045 的行是重復的。
如果有人可以幫助我,將不勝感激。
uj5u.com熱心網友回復:
您可以使用 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
uj5u.com熱心網友回復:
穿刺者建議的替代方案。但我承認我更喜歡他們的方法:-)
按 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441843.html
上一篇:在sql中帶大小寫的Div0
