我在表中有三列(日期類型),我想創建第四列,它需要包含前三列的最新日期。另外,前三列可以有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行