2017-04-24 6 views
0

목표 : 테이블의 현재 행을 가져와 해당 고객의 가장 최근 항목을 찾아 다음 항목에 추가하십시오. 가장 최근의 항목이 해당 행의 항목 1이면 다음 행으로 진행해야합니다. 논리는 항상 고객의 첫 행에 있어야합니다. 주문은 거래일을 기준으로하며 고객 ID별로 분할됩니다. 스크립트를 실행 한 후 원하는 결과 세트가 어떻게 보이는지 아래에 제공된 기본 데이터의 예.SQL Teradata - 첫 번째 행 데이터의 열 추가 등 제한 사항

제한 사항 : CRM 도구에서 작동하려면이 스크립트가 필요합니다. 테라 데이타의 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