2014-07-25 245 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子句表示即使所有三个原始列都为空,它也显示一行。如果那永远不会发生,或者如果它真的不想展示的话,那么你就不要这么做了。