天天看點

teradata資料庫分析函數_TERADATA中函數的使用

CAST函數  轉換函數,可以将字元型資料轉為日期型或資料型,将整型轉為浮點型,舉例如下 SELECT CAST('20140207' AS DATE FORMAT 'YYYYMMDD')        ,CAST('07' AS FLOAT)        ,CAST(15 AS FLOAT)        ,CAST(18.987654 AS DEC(5,3)) 結果為20140207,7.00,15.00,18.988 這裡說明一點 DEC(5,3)是指總共取5位,3位小數。如果CAST(18.987654 AS DEC(5,4))這樣寫會報錯,數字溢出。 另外說明一下TERADATA四舍五入的原則,内部規則:  1.當5後面有1位不為0,則進位  2.當5後面都為0或沒有其他位時根據5前面的奇偶,奇進偶不進 具體采用哪種規則由dbscontrol下的參數roundhalfwaymagupju決定,預設為FALSE采用内部規格(TERADATA定的)   分析函數 和其他類型的資料庫如ORACLE一樣,有如下的函數(列值) row_number() over(partition by col1,col2 order by col3 desc,col4 asc); rank() over(partition by col1,col2 order by col3 desc,col4 asc); TERADATA還有一個更巧的用法 qualify row_number() over(partition by col1,col2 order by col3 desc,col4 asc)=1; 這個語句是寫在WHERE條件之後的,相單于一個過濾條件。   日期函數 ADD_MONTHS 用法如下 ADD_MONTHS(cast('20130930' as date format 'yyyymmdd'),-1) 作用為求一個月前的日期 這裡需要注意 此結果為20130830而不是8月末20130831   TERADATA中取年初,月初,月末的寫法如下 SELECT CAST(SUBSTR('20140207',1,4)||'0101' AS DATE FORMAT 'YYYYMMDD')        ,CAST(SUBSTR('20140207',1,6)||'01' AS DATE FORMAT 'YYYYMMDD')        ,CAST(SUBSTR('20140207',1,6)||'01' AS DATE FORMAT 'YYYYMMDD')-1 結果為20140101,20140201,20140131。     EXTRACT函數 用來截取一個日期中的天數,月,年 SELECT EXTRACT(DAY FROM CAST('20140207' AS DATE FORMAT 'YYYYMMDD'))        ,EXTRACT(MONTH FROM CAST('20140207' AS DATE FORMAT 'YYYYMMDD'))        ,EXTRACT(YEAR FROM CAST('20140207' AS DATE FORMAT 'YYYYMMDD')) 結果為7,2,2014   擷取兩個日期之間的天數,月數,年數之差寫法如下: SELECT (DATE '2014-02-07' - DATE '2014-01-01') DAY(4)         , (DATE '2014-02-07' - DATE '2013-12-01') MONTH(4)         , (DATE '2014-02-07' - DATE '2013-05-01') YEAR(4)  結果為 37,2,1   COALESCE函數,用途若一個字段為NULL,可以用其他值代替,用法如下: COALESCE(COL1,'hello')   求字元型長度的函數有兩個 LENGTH,CHAR。這兩個函數有所差別,LENGTH函數會自動去除空格,而CHAR不會,舉例如下: SELECT LENGTH('abc   ')        ,CHAR('abc   ')        ,CHAR(TRIM('abc   '))    結果為3,6,3 另外說明一點在PERL腳本中隻能用CHAR函數,PERL不支援LENGTH函數   TERADATA中有系統月曆表 sys_calendar.calendar   TERADATA建立表的簡要寫法: CREATE MULTISET TABLE tb_name as tb_name1 with data;帶資料建表效率比較低 CREATE MULTISET TABLE tb_name as tb_name1 with no data;隻建表結構 這種寫法有個缺點,建的表tb_name 主索引不會和tb_name1一樣,建立的表主索引為預設的第一個字段,有可能主索引字段資料偏移很嚴重,資料重複率很高,這樣資料就會集中在幾個AMP上,導緻查詢效率低下。   建議用正常的建表方法 CREATE MULTISET TABLE tb_name ( col1 VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC TITLE '字段1' NOT NULL, col2 VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC TITLE '字段2' NOT NULL, col3 VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC TITLE '字段3' NOT NULL, col4 VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC TITLE '字段4' NOT NULL ) PRIMARY INDEX ColIdx ( col2,col3 );   改表名的寫法如下: RENAME TABLE tb_name to tb_name2     TERADATA還有一些常用函數是和其他資料庫一樣的,如 CASE WHEN .. THEN.. ELSE..END; GROUP BY ;DISTINCT;UNION;UNION ALL;MINUS;SUBSTR;SUM;COUNT;LEFT JOIN;RIGHT JOIN;INNER JOIN   TERADATA還有一些特定的用法,如顯示表結構:SHOW TABLE tb_name1; 顯示執行計劃:EXPLAIN sql1 列别名的使用:SELECT '1' AS col1,a.*               FROM  tb_name a               where col1='2' 這樣不管tb_name表中有多少條資料結果都為空。