3

我有两张桌子。一张桌子有分配给每位顾客的优惠券,另一张桌子有每位顾客的兑换信息。我基本上只需要留下为每个广告系列兑换的优惠券,如果 UPC 与两个广告系列重叠,它将同时计入两个广告系列(但不会在一个广告系列中计算两次)。这是兑换表的想法

| 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

我将获得比我需要的更多的记录。我不希望每次活动都计算多次相同的兑换,并且我不希望获得比原来更多的优惠券。例外情况是,不同的活动可以计算相同的兑换,但不能在一个活动中计算。(因此,如果赎回表只有第一个观察结果,我希望输出表有两个赎回 - 一个用于活动 1 中的任一优惠券 - 我不在乎哪个 - 一个用于活动 2。)

这确实是一个分配问题——在一个活动中,我想在兑换表中查找匹配项——加入它——然后为下一次观察寻找匹配项(不重复使用第一个匹配的兑换)。因此,输出表的许多可能方式之一是:

| 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 回答