私は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 |
どんな助けでも大歓迎です