2017-04-24 9 views
0

目的:テーブルの現在の行を取り出し、その顧客の最新のアイテムを見つけて、次の列に追加します。最新のアイテムがその行のアイテム1である場合は、次の行に進む必要があります。ロジックは、常にその顧客の最初の行に移動する必要があります。注文は取引日に基づいており、顧客IDで区切られています。スクリプトを実行した後に希望する結果セットの外観に加えて、以下に示す基本データの例。SQL Teradata - 最初の行データなどの列を追加する

制限事項:私はこのスクリプトがCRMツールで動作するために必要です。具体的には、teradataによるAprimo/CIM。それがあると私はCTE(With)や揮発性のテーブルを使用することはできません。また、テーブルボリュームのために複数の結合を自分自身に作成したくありません。私がこれまで行ってきた何

私は最善のアプローチは、窓関数を利用することであり得ることを感じるが、入れ子になったcase文の多くを作成し、自分自身を見つけます。私は本当に私が探している答えを得る良い方法があるかどうかを知りたがっていました。私はそれを吸うだけで、自分自身に参加しなければならないかもしれません。

Base table

Desired Result Set

クイックスタート基本表:

CREATE VOLATILE TABLE Base 
(
customer_id int 
, trans_date date 
, item varchar(1) 
) ON COMMIT PRESERVE ROWS; 


Insert Into Base (123,'2017-01-01','A'); 
Insert Into Base (123,'2017-01-02','B'); 
Insert Into Base (123,'2017-01-03','C'); 
Insert Into Base (123,'2017-01-04','D'); 
Insert Into Base (123,'2017-01-05','E'); 
Insert Into Base (999,'2017-01-06','F'); 
Insert Into Base (999,'2017-01-07','G'); 
Insert Into Base (999,'2017-01-08','H'); 

答えて

0

あり、いくつかのケースだが、ないたくさん :-)

SELECT 
    dt.*, 
    CASE 
     WHEN rn = 1 
     THEN Min(CASE WHEN rn = 2 THEN item end) Over (PARTITION BY customer_id) 
     ELSE Min(CASE WHEN rn = 1 THEN item end) Over (PARTITION BY customer_id) 
    END, 
    CASE 
     WHEN rn <=2 
     THEN Min(CASE WHEN rn = 3 THEN item end) Over (PARTITION BY customer_id) 
     ELSE Min(CASE WHEN rn = 2 THEN item end) Over (PARTITION BY customer_id) 
    END, 
    CASE 
     WHEN rn <= 3 
     THEN Min(CASE WHEN rn = 4 THEN item end) Over (PARTITION BY customer_id) 
     ELSE Min(CASE WHEN rn = 3 THEN item end) Over (PARTITION BY customer_id) 
    END 
FROM 
(
    SELECT 
     Row_Number() Over (PARTITION BY customer_id ORDER BY trans_date) AS rn 
     ,base.* 
    FROM Base 
) AS dt 
ORDER BY customer_id, trans_date 
関連する問題