1

この質問をする目的で単純化しようとしました。うまくいけば、これは理解できるでしょう。

基本的に、時間ディメンション、別のディメンション、および階層ディメンションを持つファクト テーブルがあります。質問のために、階層次元が郵便番号と州であると仮定しましょう。他の次元は説明的なものです。それを「顧客」と呼びましょう。50 人の顧客がいると仮定しましょう。

すべての顧客が時間ディメンションで毎日少なくとも 1 つのファクト行を持つ郵便番号が少なくとも 1 つある州のセットを見つける必要があります。郵便番号に 49 人の顧客しかいない場合、私は気にしません。50 人の顧客のうち 1 人でも、郵便番号に 1 日でも価値がなければ、私は気にしません。最後に、どの郵便番号が州の選択に適しているかを知る必要もあります。すべての郵便番号に完全なデータ セットが含まれている必要はありません。少なくとも 1 つの郵便番号が含まれている必要があります。

複数のクエリを作成し、クライアント側で処理を行うことは気にしません。これは、1 日に 1 回だけ生成する必要があり、キャッシュできるデータセットです。単純なブルートフォース反復以外に、複数のクエリでそれを行う特にクリーンな方法は見当たりません。また、データセットには非常に多くの「郵便番号」があります (実際には郵便番号ではありませんが、階層の下位レベルには約 100,000 のエントリがあり、最上位レベルには数百のエントリがあるため、zipcode->state は合理的な例えです)

4

1 に答える 1

1

最初の反復として、次のことを試すことができます。

仮定

  • 顧客 (すべての顧客のリスト)
  • zip_codes (すべての郵便番号のリスト)
  • 日 (すべての日のリスト)
  • ファクト (ファクト テーブル)

私はあなたがそれを打破しなければならないと信じています

1) 毎日の事実を持つ顧客と郵便番号を取得する

SELECT zip_id, customer_id, COUNT(DISTINCT days)
FROM facts
GROUP BY zip_id, customer_id
HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 

2) この結果セットから、すべての顧客を含む zip を確認します

SELECT zip_id, COUNT(DISTINCT customer_id)
FROM ( 
    SELECT zip_id, customer_id, COUNT(DISTINCT days)
    FROM facts
    GROUP BY zip_id, customer_id
    HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 
    ) S
GROUP BY zip_id
HAVING COUNT(DISTINCT customer_id) = (SELECT COUNT(*) FROM customers)

郵便番号を取得したら、簡単に州に戻すことができます。

于 2010-04-06T18:38:25.750 に答える