重点是为了记录 TD的灵巧的用法:
qualify row_number() over(partition by col1,col2 order by col3 desc,col4 asc)=1;
以下内容都是随手摘抄网上的
————————————————————————————————————————————————————
——————————————这是一个分界线————————————————
————————————————————————————————————————————————————
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表中有多少条数据结果都为空。