2017-04-19 70 views
0

我在填充SQL中的某些值時有些不可思議。這裏是我的數據結構的一個例子。按組填寫值到具體日期

ID Date Value EndDate 
A 1/1/17 500 6/1/17 
A 2/1/17 489 6/1/17 
A 3/1/17 480 6/1/17 
A 4/1/17 475 6/1/17 
A 5/1/17 460 6/1/17 
A 6/1/17 0  6/1/17 
A 7/1/17 0  6/1/17 
B 4/1/17 784 8/1/17 
B 5/1/17 801 8/1/17 
B 6/1/17 0  8/1/17 
B 7/1/17 0  8/1/17 
B 8/1/17 0  8/1/17 
B 9/1/17 0  8/1/17 
B 10/1/17 0  8/1/17 
C 2/1/17 980 7/1/17 
C 3/1/17 564 7/1/17 
C 4/1/17 647 7/1/17 
C 5/1/17 500 7/1/17 
C 6/1/17 0  7/1/17 
C 7/1/17 0  7/1/17 
C 8/1/17 0  7/1/17 

對於每個組,我想填寫值列的日期等於EndDate的點。期望的輸出將如下所示

ID Date Value EndDate 
A 1/1/17 500 6/1/17 
A 2/1/17 489 6/1/17 
A 3/1/17 480 6/1/17 
A 4/1/17 475 6/1/17 
A 5/1/17 460 6/1/17 
A 6/1/17 460 6/1/17 
A 7/1/17 0  6/1/17 
B 4/1/17 784 8/1/17 
B 5/1/17 801 8/1/17 
B 6/1/17 801 8/1/17 
B 7/1/17 801 8/1/17 
B 8/1/17 801 8/1/17 
B 9/1/17 0  8/1/17 
B 10/1/17 0  8/1/17 
C 2/1/17 980 7/1/17 
C 3/1/17 564 7/1/17 
C 4/1/17 647 7/1/17 
C 5/1/17 500 7/1/17 
C 6/1/17 500 7/1/17 
C 7/1/17 500 7/1/17 
C 8/1/17 0  7/1/17 

有什麼建議嗎?謝謝!

+0

'情況下,當Date <= EndDate then value else 0 end as value' – xQbert

+0

HI xQbert。當結果集按ID和Date排序時,我特別需要填寫最後一個非零值。這是否考慮到這種排序? –

+0

哦1秒。我現在看到,只有當日期<=結束日期時,我們纔會持有前期價值。我認爲價值包含了期望的價值。 – xQbert

回答

2

您需要申請一個LAST_VALUE基於邏輯是這樣的:變零爲NULL時的日期< =結束日期,然後尋找最近存在的價值

Last_Value(CASE 
      WHEN Date <= EndDate 
      THEN NullIf(Value,0) 
      ELSE Value 
      END IGNORE NULLS) 
Over (PARTITION BY ID 
     ORDER BY Date) 
+0

尚未完全測試,但在這一點上它看起來一切都很好! –

+0

NullIfZero? :-) –

+0

@DuduMarkovitz:沒有,因爲它是專有語法而且'NullIf(Value,0)'比'NullIfZero(Value)'短:-) – dnoeth

0

一般情況下我使用滯後()的分析,但我不認爲Teradata的支持這麼..

SELECT Id 
    , Date 
    , Case when Date<=EndDate then Lag(Value) over (order by ID, EndDate) 
      else 0 end as value 
    , EndDate 
FROM Table 

...所以...也許基於Teradata equivalent for lead and lag function of oracle

SELECT Id 
    , Date 
    , Case when Date<=EndDate then coalesce(MAX(Value) 
      over (Partition by 1 order by ID, EndDate ROWS BETWEEN 1 PRECEDING and 1 PRECEDING),0) 
      else 0 end as value 
    , EndDate 
FROM Table 

我沒有teradata的測試平臺,所以你必須讓我們知道它是否工作。或者你遇到什麼錯誤

+0

立即檢查。謝謝! –

+0

第二個人可能會因爲coalese得到一些誤報,但我不確定你想要如何處理前面的值不存在的情況。 – xQbert