常用函数说明
使用自定义查询经常能用到如下几种函数:
- 时间日期函数
- 字符串函数
- 数学函数
时间日期函数
自定义查询中和时间日期函数相关的字段分为以下三种:
一、events 表中的 time 字段
time 是毫秒级的 Timestamp 类型,可以直接使用所有的时间日期函数。
二、events 表中的 date 字段
date 是天级别的 Timestamp 类型,如果不需要时分秒的信息,使用这个字段效率会更高。date 同时也是索引字段,所以应该尽量使用此字段进行日期范围的过滤,具体请参考 "日期过滤" 中的说明。
注:1.10 版本之前,date 字段不支持使用自定义函数,可以使用 time 替代。
三、其它自定义的 Date/Datetime 类型的属性
这类属性在自定义查询中表现为毫秒级的 Unix 时间戳, 使用时间日期函数时需要先使用 EPOCH_TO_TIMESTAMP 函数转换为 Timestamp 类型,请参考 "数据类型" 中的说明。
adddate(timestamp startdate, int days), adddate(timestamp startdate, bigint days)
用途:在一个TIMESTAMP(时间戳)值上加一个给定的天数
参数:
- startdate:timestamp类型的开始时间戳
- days:需要加上的天数,正数表示几天之后,负数表示几天之前
返回值:加上天数之后的时间戳,timestamp类型
datediff(timestamp enddate, timestamp startdate)
用途:返回两个时间戳间隔天数,例如:
参数:
- enddate:结束时间
- startdate:开始时间
返回值:结束时间减去开始时间的天数,int类型。如果第一个参数时间的日期晚于第二个参数时间的日期,返回正数;相反,如果第一个参数时间的日期早于第二个参数时间的日期,返回负数
extract(unit FROM timestamp), extract(timestamp, string unit)
用途:从 TIMESTAMP 值中截取数值型的时间域,例如年度,月份,日期,小时,分钟,秒/微秒
参数:
- 时间单位 unit 字符串可取的值有:year,month,day,hour,minute,second,millisecond。
返回值:时间域的整型值
例如:目前为止所有的支付订单次数按照年度和月份查询
SELECT extract(Year from time) AS Year, extract(Month from time) AS Month, COUNT(*) FROM events
WHERE event = 'payOrder'
GROUP BY Year, Month
ORDER BY Year, Month
trunc(timestamp, string unit)
用途:从给定的 timestamp 时间戳截取时间域
参数:
- unit:时间单位
- SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y:年度
- Q:季度
- MONTH, MON, MM, RM: 月份
- WW, W: 相应周第一天的日期
- DDD, DD, J: 日期
- DAY, DY, D: 相应周第一天的日期
- HH, HH12, HH24: 小时
- MI: 分钟
返回值:截取时间域之后的日期
例如:最近 100 天内每天发生的事件数和事件发生时间与当前日期的间隔天
SELECT datediff(now(), trunc(time, 'DD')), COUNT(*) FROM events
WHERE date >= CURRENT_DATE() - INTERVAL '100' day
GROUP BY 1
字符串函数
concat(string a, string b…)
用途:把所有 string 类型的参数连接成一个 string 类型
参数:
- string (不限个数):要连接的字符串
返回值:一个整体的字符串
例如:查询 00 后用户地址,地址为省份和地区拼接
SELECT concat($province, $city) As Address
FROM users
WHERE yearofbirth > 2000
regexp_like(string source, string pattern[, string options])
用途:判断 source 字符串中是否包含以 pattern 为正则表达式的内容
参数:
- source:要检查的字符串
- pattern:正则表达式
- option(选填):选项
- c:区分大小写
- i:不区分大小写
- m:匹配多行,^ 和 $ 操作符对于每一行都会匹配,而不是对多行为整体的开头和结束。
- n:新行匹配,点(.)操作符会匹配新行。重复操作符如 . 可以匹配 source 字符串中的多行(可以通过. 跳过几行)
返回值:匹配与否,boolean 类型
例如:使用 QQ 邮箱为邮件的用户数
SELECT COUNT(*) FROM users
WHERE regexp_like(email, '@qq.com$')
parse_url(string urlString, string partToExtract [, string keyToExtract])
用途:通过指定 URL 中的特定部分返回截取值
参数:
- urlString:URL
- partToExtract:要截取的部分。可指定的值为 'PROTOCOL', 'HOST', 'PATH', 'REF', 'AUTHORITY', 'FILE', ‘USERINFO', ‘QUERY'
- PROTOCOL:协议,如 HTTP,HTTPS,FTP 等
- HOST:主机名
- PATH:路径
- REF:锚点(“又称引用”),即 URL 中 # 后面的字符串
- AUTHORITY:授权
- FILE:文件名
- USERINFO:用户信息
- QUERY:查询参数,即 URL 后面的字符串
- keyToExtract(选填):当 partToExtract 为 ’QUERY’ 时,可以指定 query 键值对中的 key,获取指定参数值
返回值:URL 中指定部分的截取值
例如:当天页面浏览事件中各个路径的访问分布情况
SELECT parse_url(url, 'PATH'), COUNT(*) FROM events
WHERE date = CURRENT_DATE() AND event = '$pageview'
GROUP BY 1
数学函数
数学函数用于一些数值的操作。 特别的,在做去幂运算时,请使用 pow() 函数取代幂运算符 ‘**’。
pow(double a, double p), power(double a, double p), dpow(double a, double p), fpow(double a, double p)
用途:取幂,例如:
参数:
- a:底数
- b:指数
返回值:a 的 b 次幂
例如:查询理财产品到期后本息总额超过10万的用户数
SELECT count(distinct(user_id)) FROM events
WHERE event = 'buyProduct' AND (capital + capital * pow(rateofinterest,duration)) > 100000
round(double a), round(double a, int d), round(decimal a, int_type d), dround(double a), dround(double a, int d)
用途:返回四舍五入值,例如:
参数:
- a:要四舍五入的数值
- d(可选):小数保留位数,若无此参数,保留到整数部分
返回值:四舍五入值
例如:查询理财产品收益率超过 0.45 百分点的用户数
SELECT count(distinct(user_id)) FROM events
WHERE event = 'buyProduct' AND round((income/capital),4) * 100 > 0.45
truncate(double_or_decimal a[, digits_to_leave]), dtrunc(double_or_decimal a[, digits_to_leave])
用途:去除小数部分的数值,例如:
参数:
- a:被截取的数值
- digits_to_leave(可选):小数点保留位数,若无此参数,保留到整数部分
返回值:被截取的值
impala 函数
请参考:Impala 函数参考文档
神策自定义 impala 函数
percentile_count函数
SELECT day,percentile_count(perf_metric_ic_m_copy, 0.3) FROM events
group by 1