0

标题有点含糊,但让我告诉你我想做什么,并告诉你我的数据有什么问题。

我需要总结表中所有唯一行的单元格值(大小)。但是我的数据有点“坏”。我正在使用 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。

我可以为相同的哈希选择任何一种大小并在求和中使用它。

4

1 回答 1

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
于 2012-06-27T16:27:19.283 回答