SQL连接只允许每个表中的一个匹配

时间:2013-05-14 13:36:12

标签: sql oracle join allocation

我有两张桌子。一个表具有分配给每个客户的优惠券,另一个表具有针对每个客户的兑换信息。我基本上只需要为每个广告系列保留兑换的优惠券,如果UPC重叠两个广告系列,则会计入两个广告系列(但在一个广告系列中不计算两次)。这是一个关于redemtion表的想法

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

非常感谢任何帮助

1 个答案:

答案 0 :(得分: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吗?你能记录下来吗?

我认为虽然今天可以为您的问题找到技术解决方案,但您不会记录足够完整的此类应用程序的信息。