3

私は2つのテーブルを持っています。1 つのテーブルには各顧客に割り当てられたクーポンがあり、もう 1 つのテーブルには各顧客の引き換え情報があります。基本的に、各キャンペーンで使用されたクーポンのみを残す必要があり、UPC が 2 つのキャンペーンに重なっている場合は、両方にカウントされます (ただし、1 つのキャンペーン内で 2 回カウントされることはありません)。これが償還テーブルのアイデアです

| customer_id | UPC  | redeem_date_id |
|-------------|------|----------------|
|     1234    | 3456 |       42       |
|     1234    | 3456 |       43       |
|     1234    | 3456 |       44       |
|     1234    | 3456 |       49       |

クーポンが割り当てられたテーブルは次のようになります

 | customer_id | campaign_id | UPC  | print_date_id | expire_date_id |
 |-------------|-------------|------|---------------|----------------|
 |    1234     |      1      | 3456 |      35       |       45       |
 |    1234     |      1      | 3456 |      40       |       50       |
 |    1234     |      2      | 3456 |      41       |       51       |

この例では、顧客は割り当てられたクーポンよりも多くの引き換えを行っていますが (どこかでクーポンをクリップした可能性があるためなど)、引き換えよりも多くのクーポンを割り当てられている可能性もあります。

明らかに私が

where a.customer_id = b.customer_id and a.upc=b.upc and 
redeem_date_id between print_date_id and expire_date_id

必要以上に多くのレコードが戻ってきます。キャンペーンごとに同じ引き換えが 2 回以上カウントされることは望ましくありません。また、最初に持っていたよりも多くのクーポンが戻ってくることも望ましくありません。例外として、1 つのキャンペーン内だけでなく、異なるキャンペーンでも同じ引き換えがカウントされる場合があります。(したがって、償還テーブルに最初の観察結果しかない場合、出力テーブルに 2 つの償還が必要です。1 つはキャンペーン 1 のいずれかのクーポン用です。どちらでも構いません。もう 1 つはキャンペーン 2 です。)

これは実際には割り当ての問題です。キャンペーン内で、償還テーブルで一致を探したい - 参加してから、次の観察のために一致を探します (最初に一致した償還を再利用せずに)。したがって、出力テーブルが見える可能性のある多くの方法の1つは次のとおりです。

| customer_id |campaign_id|UPC |print_date_id|expire_date_id|redeem_date_id|
|-------------|-----------|----|-------------|--------------|--------------|
|    1234     |      1    |3456|     35      |        45    |      42      |
|    1234     |      1    |3456|     40      |        50    |      43      |
|    1234     |      2    |3456|     41      |        51    |      42      |

どんな助けでも大歓迎です

4

1 に答える 1

0

サブクエリを使用して、最小の日付を選択できます。何かのようなもの:

select *
from a inner join b
on a.customer_id = b.customer_id
   and a.upc = b.upc
   and redeem_date_id between print_date_id and expire_date_id
where b.print_date_id = (
   select min(print_date_id)
   from b as b2
   where b2.customer_id = a.customer_id
   and b2.upc = a.upc
   and a.redeem_date_id between b2.print_date_id and b2.expire_date_id
)

私はそれをテストしていませんが(まだ)。

しかし、他の何かが私を悩ませています。クーポンを確認する

 | customer_id | campaign_id | UPC  | print_date_id | expire_date_id |
 |-------------|-------------|------|---------------|----------------|
 |    1234     |      1      | 3456 |      35       |       45       |

およびお客様の引き換えデータ

| customer_id | UPC  | redeem_date_id |
|-------------|------|----------------|
|     1234    | 3456 |       42       |
|     1234    | 3456 |       43       |

日付 35 ~ 45 に有効なクーポンが日付 42 または 43 に引き換えられたかどうかを識別する情報は保持されません。

つまり、一部の情報が欠落しているように見えます。この時点で引き換えられたのはどのクーポンですか? クーポンごとに固有の ID はありませんか? それを記録できないのですか?

現在、問題の技術的な解決策を見つけることは可能ですが、この種のアプリケーションに十分な情報を記録していないと思います。

于 2013-05-16T13:42:06.737 に答える