2013-05-14 39 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

相關問題