我在表中有三列(日期类型),我想创建第四列,它需要包含前三列的最新日期。另外,前三列可以有NULL值。 除了使用CASE语句之外,Teradata中是否有任何特殊功能或有关如何解决此问题的优雅方法?选择最近的日期
Q
选择最近的日期
1
A
回答
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
子句表示即使所有三个原始列都为空,它也显示一行。如果那永远不会发生,或者如果它真的不想展示的话,那么你就不要这么做了。
相关问题
- 1. 选择最近的日期
- 2. 选择最近的日期
- 3. 选择最近日期
- 4. SQL选择最近日期的行
- 5. 选择最近的日期群组
- 6. Oracle选择最近的日期记录
- 7. mysql分组选择最近的日期
- 8. MySQL选择最近日期的记录
- 9. 请选择最近的日期
- 10. 选择限于最近日期的行
- 11. 如何选择最近的日期项
- 12. 按最近日期选择记录
- 13. 在SQL中选择最近日期
- 14. Mongo MapReduce选择最近日期
- 15. 在SQL查询中选择最近或最近日期
- 16. 选择距离另一个日期最近的日期
- 17. firebird 2.5选择日期最近的日期记录
- 18. MS Access选择与日期最接近的日期记录
- 19. Jquery选择距离所选日期最近的工作日
- 20. 4日期列 - 组合字段选择最近日期?
- 21. 选择日期在另一个表中最接近日期
- 22. MySQL:在特定日期前选择最近日期
- 23. MYSQL选择日期范围最接近当前日期
- 24. MySQL:选择最近的回复按最大日期从JOINing表
- 25. SQL Sybase ASE - 选择最近的日期和最大价格
- 26. 选择查询以选择最近的日期,该日期小于或等于postgresql中的当前日期
- 27. 选择最早的日期
- 28. 选择最多的日期
- 29. 选择具有最近的日期时间值的记录
- 30. 选择列的最接近当前日期的MySQL行