2014-03-01 1 views
0

날짜와 값이 확장되고 누락 날짜를 순서대로 채우는 테이블이 있습니다. 내가 그룹과 위치별로 이것을하고 있지만, 내가해야 할 일의 핵심은 아래에 나와있다. 내가Teradata 조건부 확장

dt | val 
2014-01-01 | 10 
2014-02-17 | 9 
2014-04-21 | 5 

내가이 확장 한 다음 테이블이 말은 제로에 누락 일주일 테이블 작성입니다

week_bgn_dt| week_end_dt| val 
2014-01-01 | 2014-01-08 | 10 
2014-01-09 | 2014-01-16 | 0 
2014-01-17 | 2014-01-24 | 0 
... 
2014-02-10 | 2014-02-17 | 0 
2014-02-18 | 2014-02-25 | 9 
2014-02-26 | 2014-03-05 | 0 
2014-03-06 | 2014-03-13 | 0 
... 
2014-03-30 | 2014-04-06 | 0 
2014-04-07 | 2014-04-14 | 0 
2014-04-15 | 2014-04-22 | 5 

내가 원하는 것은 변화 할 때까지 마지막 값으로 입력, 그래서 출력하고자 테라 데이타에서

week_bgn_dt| week_end_dt| val 
2014-01-01 | 2014-01-08 | 10 
2014-01-09 | 2014-01-16 | 10 
2014-01-17 | 2014-01-24 | 10 
... 
2014-02-10 | 2014-02-17 | 10 
2014-02-18 | 2014-02-25 | 9 
2014-02-26 | 2014-03-05 | 9 
2014-03-06 | 2014-03-13 | 9 
... 
2014-03-30 | 2014-04-06 | 9 
2014-04-07 | 2014-04-14 | 9 
2014-04-15 | 2014-04-22 | 5 

처럼이

case when val <> 0 then val 
    else sum(val) over (partition by group, location order by group, store, week_bgn_dt 1 preceding to current row) as val2 
을 시도 본다 나는 최대 (와 시도

case when val <> 0 then val 
    else sum(val) over (partition by group, location order by group, store, week_bgn_dt unbounded preceding to current row) as val2 

week_bgn_dt| week_end_dt| val | val2 
2014-01-01 | 2014-01-08 | 10 | 10 
2014-01-09 | 2014-01-16 | 0 | 10 
2014-01-17 | 2014-01-24 | 0 | 10 
... 
2014-02-10 | 2014-02-17 | 0 | 10 
2014-02-18 | 2014-02-25 | 9 | 9 
2014-02-26 | 2014-03-05 | 0 | 19 
2014-03-06 | 2014-03-13 | 0 | 19 
... 
2014-03-30 | 2014-04-06 | 0 | 19 
2014-04-07 | 2014-04-14 | 0 | 19 
2014-04-15 | 2014-04-22 | 5 | 5 

새 값을 쳤을 때

하지만은과 같이 한 번 마지막 값을주고,

week_bgn_dt| week_end_dt| val | val2 
2014-01-01 | 2014-01-08 | 10 | 10 
2014-01-09 | 2014-01-16 | 0 | 10 
2014-01-17 | 2014-01-24 | 0 | 0 
... 
2014-02-10 | 2014-02-17 | 0 | 0 
2014-02-18 | 2014-02-25 | 9 | 9 
2014-02-26 | 2014-03-05 | 0 | 9 
2014-03-06 | 2014-03-13 | 0 | 0 
... 
2014-03-30 | 2014-04-06 | 0 | 0 
2014-04-07 | 2014-04-14 | 0 | 0 
2014-04-15 | 2014-04-22 | 5 | 5 

나는 창을 억제 할 수 있도록하는 경우, 그것은 요약) 및 min()과 유사하지만 결과는 비슷합니다. 도움을 주셔서 감사합니다.

+0

일주일은 어떻게 정의됩니까? 귀하의 예를 기반으로 8 일 것으로 보입니까? 그 주들은 항상 8 일을 기준으로하고 있으며, 그들은 val과 어떤 관련이 있습니까? – dnoeth

+0

TD 릴리스는 무엇입니까? TD13에는 언제든지 재설정이 있지만 TD13.10의 확장은 가장 쉬운 방법 일 수 있습니다. – dnoeth

답변

1

이 문제는 SUM 작업의 분할과 관련이있는 것으로 보입니다. OVER 절을 지정하면 SUM은 각 파티션에 대해 0부터 시작하여 각 파티션에 대한 결과를 따로 계산합니다. SUM이 여러 파티션에서 작동하는 것으로 보입니다. SUM을 여러 파티션에서 작동하는 방식으로 알 수 없기 때문에 파티셔닝을 다른 것으로 다시 정의하는 것이 좋습니다.

나는 귀하의 경우, SUM은 파티션을 전혀 사용하지 않아야합니다. 우리가 필요로하는 것은 RESET WHEN 기능과 윈도우 조작 OVER입니다. 확장 된 결과를 0으로 채운 다음 쿼리를 통해 필요한 결과를 얻었습니다.

SELECT 
    week_bgn_dt, 
    week_end_dt, 
    val, 
    SUM(val) OVER (PARTITION BY 1 
        ORDER BY location ASC, week_bgn_dt ASC 
        RESET WHEN val<>0 
        ROWS UNBOUNDED PRECEDING) AS val2 
FROM test 

week_bgn_dt | week_end_dt | val | val2 
2014-01-01 | 2014-01-08 | 10 | 10 
2014-01-09 | 2014-01-16 | 0 | 10 
2014-01-17 | 2014-01-24 | 0 | 10 
2014-02-10 | 2014-02-17 | 0 | 10 
2014-02-18 | 2014-02-25 | 9 | 9 
2014-02-26 | 2014-03-05 | 0 | 9 
2014-03-06 | 2014-03-13 | 0 | 9 
2014-03-30 | 2014-04-06 | 0 | 9 
2014-04-07 | 2014-04-14 | 0 | 9 
2014-04-15 | 2014-04-22 | 5 | 5 

제공된 데이터에 위치 만 추가했음을 눈치 챘을 것입니다. 나는 당신이 ORDER BY 조항에 나머지 필드를 추가하고 올바른 결과를 얻을 수 있다고 생각합니다.