2013-05-14 41 views
3

我有两个表。一张桌子有分配给每个顾客的优惠券,另一张桌子有每个顾客的兑换信息。我基本上只需要为每个活动兑换优惠券,如果UPC与两个活动重叠,它将被计入两次(但不会在一次活动中计算两次)。这里的redemtion表SQL连接允许每个表只有一个匹配

| 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 

我会收获更多的记录回比我更需要。我不希望每次活动都有相同的赎回次数超过一次,而且我也不希望获得比原来更多的优惠券。例外情况是,对于不在一个广告系列中的不同广告系列,可以计算相同的兑现次数。 (所以如果兑换表只有第一个观察结果,我希望输出表有两个兑换 - 一个用于第一个广告系列的优惠券 - 我不在乎哪一个 - 第二个广告系列用于一个广告系列)。

这实际上是一个分配问题 - 在我希望在兑换表中查找匹配的广告系列中,加入它 - 然后查找下一个观察的匹配项(不重复使用第一个匹配的兑换项)。因此,许多可能的方式输出表可以看一个是:

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

任何帮助是通过使用子查询不胜感激

+0

同一位客户是否可以在同一天为同一个“UPC”和同一个“活动”兑换多于一张的优惠券(即相同的“redeem_date_id”)? – 2013-05-14 14:00:14

+0

是的,所以如果您剪下两张相同的优惠券并在一次交易中兑换,它基本上看起来就像兑换表中的两个相同的观察。 (如果你正在寻找一个唯一的标识符,我可以对这些观察数据进行编号)。 – 2013-05-14 14:49:17

+0

我在考虑使用GROUP BY来平整表格,但需要保留正确的'print_date_id' - 'expire_date_id'对。 – 2013-05-14 15:50:41

回答

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 | UPC | redeem_date_id | 
|-------------|------|----------------| 
|  1234 | 3456 |  42  | 
|  1234 | 3456 |  43  | 

他们不抱任何信息来区分优惠券在35-45日期是否有效在42日或43

赎回

换句话说,某些信息似乎丢失了:此时已兑换哪张优惠券?每张优惠券是否没有唯一ID?你不能记录吗?

我认为尽管今天可​​以找到针对您问题的技术解决方案,但您没有记录足够完整适用于此类应用程序的信息。

+0

当然,如果每张打印的优惠券都有一个绝对唯一的标识符,与分配的优惠券相匹配,兑换将变得轻而易举。不幸的是,我没有制定优惠券行业标准的政策。一般来说,条形码甚至不是特定活动所特有的(这个问题的一部分),更不用说打印每张优惠券了。 – 2013-05-17 13:59:36

+0

好的 - 对不起,我在大西洋的错误的一面知道:) – boisvert 2013-05-17 14:01:22

+0

@GeorgeHarrison,让我知道,如果查询有帮助;我的答案的后半部分 - 也会被编辑出来,但对后来的读者来说它具有普遍价值吗? – boisvert 2013-05-17 14:09:17

相关问题