0

具体的な例として、T列を持ち、個々の顧客が購入した日を示すcustomerテーブルがあるとします。date

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)
  • 左結合TT';
  • 新しい列を作成します: 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 が非等価結合をどれだけうまく処理できるかに依存します。 DB2 EXPLAINがガイドします。「purchase_date」のインデックスと制限付きの WHERE 句がうまく機能することを期待しています。

于 2013-05-14T17:54:13.513 に答える