2013-05-14 62 views
0

作爲一個具體示例,假設我有一個表T,其中列customerdate表示個人客戶進行購買的日期:對滿足某些條件的表中以滿足某些條件的表格中的行數進行計算的動態方式

customer | date 
---------------------- 
     A | 01/01/2013 
     A | 02/01/2013 
     A | 07/01/2013 
     A | 11/01/2013 
     B | 03/01/2013 
     B | 08/01/2013  

我要添加另一列,對於每對(customer, date)(c, d),給出對(c', d')T使得c = c'0 <= days(d) - days(d') <= 7數。下面是這個額外列的表:

customer | date  | new_column 
---------------------------------- 
     A | 01/01/2013 |   1 
     A | 02/01/2013 |   2 
     A | 07/01/2013 |   3 
     A | 11/01/2013 |   2 
     B | 03/01/2013 |   1 
     B | 10/01/2013 |   1 

由於我用來解決這個問題的步驟一個粗略的想法:

  • 創建一個表T'所有可能的對(c,d);
  • left join T into T';
  • 創建一個新列:count(date) over (partition by customer order by date asc rows between 6 preceding and 0 following);
  • 從這個新表忽略任何行,其中T.date is null

不過,我不認爲這是可伸縮的。

乾杯任何幫助。

+0

您可以通過具有自加入的查詢來獲取信息。爲什麼你需要在桌子上放一個新的專欄? – 2013-05-14 16:44:43

回答

0

讓我們從一些DDL開始吧。 (如果包括DDL和您的問題樣本INSERT語句你會得到更多的答案和更好的答案。)

create table test (
    customer char(1) not null, 
    purchase_date date not null, 
    primary key (customer, purchase_date) 
); 

insert into test values 
('A', '2013-01-01'), 
('A', '2013-01-02'), 
('A', '2013-01-07'), 
('A', '2013-01-11'), 
('B', '2013-01-03'), 
('B', '2013-01-10'); 

在標準SQL中,你可以使用這些方針的東西。它不需要創建另一個表,外部連接或窗口函數。目前還不清楚您是否有足夠的理由要創建新表格,但沒有必要獲取正確的數據。 (我改名爲「日期」一欄,以避免保留字。)

select t1.customer, t1.purchase_date, count(*) new_column 
from test t1 
inner join test t2 on t1.customer = t2.customer 
and t2.purchase_date <= t1.purchase_date and t2.purchase_date > t1.purchase_date - interval '7 day' 
group by t1.customer, t1.purchase_date 
order by t1.customer, t1.purchase_date; 

customer purchase_date new_column 
-- 
A   2013-01-01  1 
A   2013-01-02  2 
A   2013-01-07  3 
A   2013-01-11  2 
B   2013-01-03  1 
B   2013-01-10  1 

這是否很好地進行擴展取決於DB2如何處理非相等連接。 DB2 EXPLAIN將引導你。我期望「purchase_date」的索引和限制性的WHERE子句表現良好。

相關問題