2014-07-25 243 views
1

我在表中有三列(日期類型),我想創建第四列,它需要包含前三列的最新日期。另外,前三列可以有NULL值。 除了使用CASE語句之外,Teradata中是否有任何特殊功能或有關如何解決此問題的優雅方法?選擇最近的日期

回答

3

有一個最好的函數,但如果任何一個日期爲NULL,它將返回NULL。

作爲解決方法,您可以使用未使用的日期來合併NULL。如果這三個字段都是NULL,你終於可以申請NULLIF:

NULLIF(GREATEST(COALESCE(col1,DATE '0001-01-01') 
       ,COALESCE(col2,DATE '0001-01-01') 
       ,COALESCE(col3,DATE '0001-01-01') 
       ) 
     , DATE '0001-01-01' 
    ) 

Teradata的支持TD14最大的功能,但由於奇怪的原因,它不是:-(

的日期確定,但有一個變通方法:

CAST(NULLIF(GREATEST(COALESCE(CAST(col1 AS INT),-1) 
      ,COALESCE(CAST(col2 AS INT),-1)       
      ,COALESCE(CAST(col3 AS INT),-1)       
      ) 
    ,-1) AS DATE) 

順便說一句,消協的做法並不壞,每次當需要一列少:

CASE 
    WHEN COALESCE(col1, DATE '0001-01-01') >= COALESCE(col2, DATE '0001-01-01') 
    AND COALESCE(col1, DATE '0001-01-01') >= COALESCE(col3, DATE '0001-01-01') 
    THEN col1 
    WHEN COALESCE(col2, DATE '0001-01-01') >= COALESCE(col3, DATE '0001-01-01') 
    THEN col2 
    ELSE col3 
END 
0

如果您使用11g,則可以使用unpivot將cols轉換爲單獨的行,然後聚合這些行。不知道這可以算作「高雅」,但它不使用case ...

select id, col1, col2, col3, max(unpivot_col) as col4 
from (
    select * 
    from (
    select id, col1, col2, col3, 
     col1 as x_col1, col2 as x_col2, col3 as x_col3 
    from t42 
) 
    unpivot include nulls (unpivot_col for col in (x_col1, x_col2, x_col3)) 
) 
group by id, col1, col2, col3 
order by id; 

SQL Fiddle與中間步驟。

內部查詢創建用於unpivot的額外列,因爲我認爲您還想顯示原始的三個值。如果你不這樣做,你可以直接從你的表中選擇,並在col等未選擇。

include nulls子句表示即使所有三個原始列都爲空,它也顯示一行。如果那永遠不會發生,或者如果它真的不想展示的話,那麼你就不要這麼做了。