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)pair添加另一列(c, d),给出这样的(c', d')对数和。下面是这个额外列的表格:Tc = 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)
  • T加入T'
  • 创建一个新列:count(date) over (partition by customer order by date asc rows between 6 preceding and 0 following);
  • 省略此新表中的任何行T.date is null

但是,我不认为这是可扩展的。

为任何帮助而欢呼。

4

1 回答 1

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 处理非 equi 连接的能力。 DB2 EXPLAIN将指导您。我希望“purchase_date”上的索引和限制性 WHERE 子句表现良好。

于 2013-05-14T17:54:13.513 回答