簡體   English   中英

在選擇具有“不良”數據的不同行時匯總行

[英]Aggregating rows when selecting distinct rows with “bad” data

標題有點含糊,但讓我告訴您我想做什么,並告訴您我的數據有什么問題。

我需要總結表中所有唯一行的單元格值(大小)。 但是我的數據有點“不好”。 我正在使用MAPI,對於相同的消息內容,MAPI返回的消息大小可能不確定。

我有兩個類似的表/任務:消息和附件。 由於SHA1哈希始終與附件大小相關,因此處理附件更加容易。 附件數據如下所示(制表符分隔,可用於Excel):

Hash Size
0x0015A93FFFB1726E6647F94F47F4998AC699A455 97
0x0015A93FFFB1726E6647F94F47F4998AC699A455 97
0x0020CE1810B56CC17F6CFD0A0B6121592825F7E5 85
0x0086077DD1E4AF6A38014AB505105B05F8F5311E 62
0x0086077DD1E4AF6A38014AB505105B05F8F5311E 62
0x00A6510EEDB20A27B00B23416CF755715647A351 85
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777
0x011C9258A0E16E25662E8F3BEE8A1462C175C117 87777

這是我用來獲取表上所有重復附件的總大小的查詢:

select
    sum(at.sz) as Size
from
(
    select distinct
        Hash,
        sz = Size * ((sum(1) over (partition by Hash)) - 1)
    from
        Attachment
) as at

(我從附件數中減去1,以獲得真實的重復數:附件總數– 1 =該附件的重復項數)

現在,真正的麻煩是郵件,因為MAPI報告的郵件大小和所有隱藏的廢話的大小以及相同內容+附件的郵件大小可以不同(請注意,對於某些具有相同哈希值的郵件,其大小也不同):

Hash Size
0x001B05F4D041EB0E61ADDEA45A1F7AFAD5C088AB 3248
0x001B05F4D041EB0E61ADDEA45A1F7AFAD5C088AB 3248
0x001B05F4D041EB0E61ADDEA45A1F7AFAD5C088AB 3260
0x001B05F4D041EB0E61ADDEA45A1F7AFAD5C088AB 3260
0x001B05F4D041EB0E61ADDEA45A1F7AFAD5C088AB 3264
0x001B05F4D041EB0E61ADDEA45A1F7AFAD5C088AB 3266
0x00510D4B3A9D42C8D8E236950B7FBBD5FB716698 12040
0x00D92C8EB7E718EF418BC9D843D760FD1F4B208B 3657
0x00D92C8EB7E718EF418BC9D843D760FD1F4B208B 3659
0x00D92C8EB7E718EF418BC9D843D760FD1F4B208B 3671
0x011683250CC8D779EC3F33C23209C26E27E25E73 5143
0x016D424B6B4B7DDB4856D1660ECBFEBDD3ECACCA 3531
0x016D424B6B4B7DDB4856D1660ECBFEBDD3ECACCA 3543
0x016D424B6B4B7DDB4856D1660ECBFEBDD3ECACCA 3549
0x016D424B6B4B7DDB4856D1660ECBFEBDD3ECACCA 3559

使用這樣的數據,上面的查詢無法返回任何有意義的值,因為不同對的計數並不總是= 1。

我可以選擇相同散列的任何大小並將其用於求和中。

with HashDups as (
  select Hash,
         (count(*)-1)*max(size) as size
    from Messages
   group by Hash
)
select sum(size) as size from HashDups

當然,相同的構造也可以與附件一起使用。

我不完全了解大小變化的問題。 也許以下更准確。 它假定每個“重復項”的報告大小是真實的(重復項如何具有不同的大小?)。 您可以通過從總和中減去最小和最大大小來找出每個哈希值的最小和最大重復大小。 然后,您可以計算最小和最大總重疊大小。 您最終的真實價值應該在這兩個極端之間。

with HashDups as (
  select Hash,
         sum(size)-max(size) as minDupSize,
         sum(size)-min(size) as maxDupSize
    from MAPI
   group by Hash
)
select sum(minSupSize) as minDupSize,
       sum(maxDupSize) as maxDupSize
  from HashDups

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM