0

タイトルは少し漠然としていますが、何をしたいのかを説明し、データの何が問題なのかを示しましょう。

テーブル内のすべての一意の行のセル値 (サイズ) を合計する必要があります。しかし、私のデータは一種の「悪い」ものです。私は MAPI を使用していますが、MAPI によって返されるメッセージ サイズは、同じメッセージ コンテンツに対して非決定論的に異なる場合があります。

メッセージと添付ファイルという 2 つの同様のテーブル/タスクがあります。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

もちろん、同じ構造が添付ファイルでもうまく機能します。

さまざまなサイズの問題を完全には理解していません。おそらく、以下の方が正確でしょう。各「複製」の報告されたサイズが実際のものであると想定しています (複製のサイズが異なる場合はどうすればよいでしょうか?)。合計から最小サイズと最大サイズを差し引くことで、各ハッシュ値の最小重複サイズと最大重複サイズを計算できます。次に、最小および最大の合計 dup サイズを計算できます。最終的な真の価値は、これら 2 つの極端な範囲内にある必要があります。

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 に答える