Fine BI 学习笔记(一)-----函数篇

8 阅读15分钟

1、数值函数

1.1、数值处理函数

  • abs(number):返回绝对值
    abs(1.1) = 1.1
    abs(-2.1) = 2.1
  • ceiling():绝对值增大方向取整
    ceiling(2.1) = 3
    ceiling(-3.2) = -4
  • floor():绝对值减小的方向取整
    floor(2.1) = 2
    floor(-3.2) = -3
  • int():值减小的方向取整
    int(2.1) = 2
    int(-3.2) = -4
  • round():四舍五入
    round(number,num):number要处理的数据,num要舍入的位数,num为负数时,则对小数点前第num位进行舍入
    round(1.24, 1) = 1.2
    round(1.25, 1) = 1.3
    round(-1.24, 1) = -1.2
    round(25.12, -1) = 30
    round(123.5, -2) = 100
  • trunc():数值小数截取
    trunc(number,num):number要处理的数据,num要截取的位数,num为负数时,则从小数点前第num位进行截取
    trunc(1.24, 1) = 1.2
    trunc(1.25, 1) = 1.2
    trunc(-1.24, 1) = -1.2
    trunc(25.12, -1) = 20
    trunc(123.5, -2) = 100

1.2、数值计算函数

  • power():a的b次方,power(a, b)等于a ^ b
    power(3, 2) = 9
  • sqrt():开平方
    sqrt(number):返回number的算数平方根(正的平方根),number必须为非负数,number为负数时,返回空值
    sqrt(9) = 3
    sqrt(-9) = 空值
  • fact():阶乘
    fact(2) = 1 * 2 = 2
    fact(4) = 1 * 2 * 3 * 4 = 24
    fact(4.9) = fact(4) = 24 number是小数时,截取整数位进行阶乘运算
    fact(-10) 返回空值
  • max():最大值
    max(number1, number2, number3, ...) 返回number1, 2, 3, ...中的最大值,行运算,不是sql里的列运算
  • min():最小值
  • mod():取余
    mod(a, b) 返回a / b 的余数,结果的正负与b一致
    mod(3, 2) = 1
    mod(3, -2) = -1
    mod(3, 0) = ∞ 无穷大
  • rand():[0, 1)之间的随机数
  • randbetween():指定范围的随机整数
    randbetween(a, b) 返回(a,b]之间的随机整数,a和b整数部分相等时,返回整数部分
  • sign():返回数值正负性,整数为1,负数为0

1.3、其他不常用函数

pi(number):数学常量函数,返回pi的number整数倍,pi(number) = pi(trunc(number)),number为空时,1倍
sin():返回给定弧度的正弦值,sin(30 * pi() / 180) = 0.5 :30度的正弦值
cos():返回给定弧度的余弦值
tan():返回给定弧度的正切值
asin():返回给定数值的反正弦值,返回值是弧度,asin(0.5) = pi() / 6,即30度
acos():返回给定数值的反余弦值
atan():返回给定数值的反正切值
atan2(x, y):返回(x, y)坐标的反正切值,atan2(sqrt(3), 1) = pi() / 6,即30度
degrees():将弧度转化为度数,degrees(pi() / 2) = 90,degrees(3.1415926) = 179.9999
radians():将角度转化为弧度,randians(180) = 3.1415
exp():e的n次幂
ln(): 返回number的自然对数,ln(exp(3)) = 3
log(a, b):按指定的底数b,返回a的对数,b默认值为10,log(16, 2) = 4
log10():返回以10为底的对数,log10(10) = 1
promotion(a, b):返回b在a上提升的比例,(b - a) / a,promotion(-12, 14) = 2.1666,即提升了216.66%

2、日期函数

2.1、日期获取函数

  • now():获取当前时间
  • lunar(year, month, day):返回当前日期对应的农历时间,支持的时间段为1900-2100年 lunar(2024, 7, 25) = "甲辰年六月廿十"
  • today():获取当前日期
  • time(hour, minute, second):返回指定的日期和时间,日期随当天日期改变 time(1, 1, 1) = "2024-07-25 01:01:01"

2.2、日期转换函数

  • date(year, month, day):返回日期,month大于12时,年份进位,day超过当月天数时,月份进位
    date(2024,13,32) = 2025-02-01 00:00:00
  • datedelta(date, num):返回日期date后num天的日期,date支持文本类型和日期类型,num为负数,则是date前num天
    datedelta("2021-01-01", 1) = 2021-01-02 00:00:00
    datedelta("2021-01-02", -1) = 2021-01-01 00:00:00
  • monthdelta(date, num):返回日期date后num个月的日期,date支持文本类型和日期类型,num为负数时,则是date前num月
    monthdelta("2021-01-01", 1) = 2021-02-01 00:00:00
    monthdelta("2021-02-01", -1) = 2021-01-01 00:00:00
  • yeardelta(date, num):返回日期date后num年的日期,date支持文本类型和日期类型,num为负数时,则是date前num年
    yeardelta("2021-01-01", 1) = 2022-01-01 00:00:00
    yeardelta("2021-01-01", -1) = 2020-01-01 00:00:00
  • datetonumber(date):返回date的毫秒级时间戳,即1970-01-01 00:00:00GMT到date所经过的毫秒数
    datetonumber("1970-01-01 8:00:00") = 0
    datetonumber("1970-01-01 8:00:01") = 1000
  • second(date, 格式):返回给定时间的秒数,参数省略时,返回当前时间的秒数
    second("2021-01-01 00:00:01") = 1
    second("2021-01-01 01:02:03", "YYYY-MM-dd HH:mm:ss") = 3
    second("2021-01-01 01:02:03", "YYYY-MM-dd HH:ss:mm") = 2
    second("01:02:03") = 3
  • minute(date, 格式):返回给定时间date的分钟数,用法同second
  • hour(date, 格式):返回给定时间date的小时数,用法同second
  • day(date, 格式):返回给定时间date的天数,用法同second
  • days360(start_time, end_time, method):每月按30天算,返回start_time到end_time之间的天数,不足一天也按一天算;method取值为空、false和true,没看出区别
    das360("2021-01-01 23:59:59", "2021-01-02 00:00:00", true) = 1
  • month(date, 格式):返回给定时间date的月份数,用法同second
  • week(date, "F1"/"F7"):返回date属于当年的第几周,参数2设置一周的开始是周一还是周日,不输入默认为周日F7 week("2024-01-01") = 53;周一,因为周日为一周的第一天,所以2024-01-01属于2023年的最后一周
    week("2024-01-01", "F1") = 1
  • year(date, 格式):返回给定时间date的年份,范围是1900到9999,用法同second
  • todate():将参数转换成日期类型,参数支持日期型、时间戳、日期格式的文本、日期格式文本加日期解析格式、日期格式文本加日期解析格式加解析日期的语言(zh,en),如果EEE和MM/dd/yy不一致,以后者为准
    todate(date(2021,01,01)) = 2021-01-01 00:00:00
    todate(3600000) = 1970-01-01 09:00:00
    todate("2024-01-01") = 2024-01-01 00:00:00 todate("2024-07-01 02:03:04", "yyyy-MM-dd HH:mm:ss") = 2024-07-01 02:03:04
    todate("星期一2024-07-01", "EEEyyyy-MM-dd", "zh") = 2024-07-01 00:00:00
    todate("星期三2024-07-01", "EEEyyyy-MM-dd", "zh") = 2024-07-01 00:00:00

2.3、日期计算函数

  • datedif(start_time, end_time, unit):返回start_time和end_time之间的unit差值,不足部分算1unit,unit不区分大小写;unit = "y"、"m"、"d"分别代表年月日差值;unit = "md",忽略年月,返回日差值;unit = "ym",忽略年日,返回月差值;unit = "yd",忽略年,返回日差值
    datedif("2021-01-02", "2021-02-01", "d") = 30
    datedif("2021-01-02", "2021-02-01", "m") = 1
    datedif("2021-01-02", "2022-01-01", "y") = 1
    datedif("2021-01-02", "2021-02-01", "md") = -1
    datedif("2021-01-02", "2022-02-01", "ym") = 1
    datedif("2021-01-02", "2022-02-01", "yd") = 30
  • datesubdate(date1, date2, op):返回date1和date2之间的时间差,date1早于date2时,结果为负数;op不区分大小写,op = "w","d","h","m","s"时,分别求周天时分秒差值;返回值floor取整,即不足1op的部分舍去
    datesubdate(d1, d2, "w") = floor(datesubdate(d1, d2, "d") / 7)
  • daysofmonth(date):返回1900-01-01之后某年某月的天数
  • daysofquarter(date):返回1900-01-01之后date日期所属季度的天数
  • daysofyear(date):返回1900-01-01之后某年的天数,1900年及之前的年份,返回值都为356
  • weekday(date):返回date是星期几,0-6,0为周日
  • weekdate(year, month, weekofmonth, dayofweek):返回指定年月指定周的周几的具体日期,dayofmonth = -1时,表示这周的最后一天 weekdate(2024, 7, 3, 5) = 2024-07-18,返回2024年7月第3周的周4
  • dayvalue(date):返回1900年至date日期所经历的天数,不足一天的部分舍去 dayvalue("1900-01-01 23:59:59") = 1
  • quarter(date, 格式):返回日期中的季度,1-4

3、文本函数

3.1、文本转换函数

  • char(num):根据num返回对应
    char(48) = "0"
    char(70) = "F"
  • code(text):计算文本字符串第一个字符的编码,返回的编码却决于计算机使用的字符集
    code("F") = 70
    code("0") = 48
  • concatenate(text1, text2,...):将数个字符串拼接成一个字符串,没有分割符
    concatenate("a", "b", "cd") = "abcd"
  • format(object, format):返回object的format格式,结果类型为文本;object可为string,数字,时间
    format(1234.3456, "¥###0.00") = "¥1234.35";四舍五入
    format(1234.3456, "#,##0.00") = "1,234.35"
    format(1.5, "0.000%") = "150.000%"
    format(123456789, "##0.0E0") = "123.5E6";结果小数点前最多3位
    format(123456789, "0.0E0") = "1.2E8"
    format("2021-01-01", "EEE,MMMdd,yyyy") = "星期五,一月01,2021"
    format(time(14, 23, 59), "h:mm:ssa") = "2:23:59下午"
    format(time(14, 23, 59), "HH:mm:ssa") = "14:23:59下午"
  • len(str):返回文本字符串str中的字符数。空格也计数,str为数组时,返回数组长度
    len("abc") = 3
    len("a bc") = 4
    len(["a", "b", "c"]) = 3
  • numto(number, boolean):返回number的中文表示。boolean默认值为false
    numto(12345) = "一万两千三百四十五"
    numto(12345, true) = "一二三四五"
    numto(12345, false) = "一万两千三百四十五"
  • todouble(str):将文本str转换成double类型,str不是数字格式时,返回0
    todouble("123.45") = 123.45
    todouble("123") = 123
    todouble("aaa") = 0
  • tointeger(str):将文本str转换成int类型,str不是数字格式时,返回0
    tointeger("-123.9") = -123
    tointeger("aaa") = 0
  • split(str1, str2):返回用str2分割str1字符串后组成的字符串数组
    split("a b c d", " ") = ["a", "b", "c", "d"]
    split("abcd", "") = ["a", "b", "c", "d"]

3.2、文本修改函数

  • indexof(str, index):返回str在index位置上的字符, index从0开始
    indexof("abcdef", 2) = c
    indexof(["a", "b", "c"], 2) = c
  • left(str, num):返回字符串str前num个字符,num默认值为1,且必须大于等于0
    left("abcde", 0) = ""
    left("abcde", 2) = "ab"
    left("abcde", 9) = "abcde"
    left("abcde", -1) = ""
  • right(str, num):返回字符串str后num个字符,num默认值为1,且必须大于等于0
    right("abcde", 0) = ""
    right("abcde", 2) = "de"
    right("abcde", 9) = "abcde"
    right("abcde", -1) = ""
  • upper(str):将文本str中所有字符转化为大写
    upper("abc") = "ABC"
  • lower(str):将文本str中所有字符转化为小写
    lower("ABC") = "abc"
  • proper():首字母大写
    proper("abc de fg") = "Abc De Fg"
    proper("00 abc de") = "00 Abc De"
    proper("00abc de") = "00Abc De"
  • mid(text, start_num, num_chars):返回text从start_num位置开始,往后的num_chars个字符;text中第一个字符的start_num为1
    mid("abcde", 2, 2) = "bc"
    mid("abcde), 2, 9) = "bcde" mid("abcde", 2, -1) = null
    mid("abcde", 0, 2) = null
  • repeat():根据指定的次数重复显示文本
    repeat("a", 4) = "aaaa"
  • replace(str1, str2, str3):用str3替换字符串str1中所有的str2
    replace("aaaacccc", "a", "b") = "bbbbcccc"
  • replace(str1, num1, num2, str2):将str1字符串从num1开始往后num2个字符,替换成str2
    replace("abcdefg", 3, 2, "ttt") = "abtttefg"
  • substitute(str1, str2, str3, num):用str3替换str1中的str2,如果指定了num,则只替换第num个str2;num为0时,不替换;num为负数时,替换第abs(num)个str2
    substitute("abcbde", "b", "t") = "atctde"
    substitute("abcbde", "b", "t", 1) = "atcbde"
  • trim(str):去除字符串str前后的空格
    trim(" ab c ") = "ab c"

3.3、文本检索函数

  • startwith(str1, str2):判断字符串str1是否是以str2开始的,str1和str2都是大小写敏感的
    startwith("abcaaa", "abc") = 1
    startwith("Abcaaa", "abc") = 0
    startwith("abcaaa", "aaa") = 0
  • endwith(str1, str2):判断字符串str1是否是以str2结束的,str1和str2都是大小写敏感的
    endwith("abcaaa", "aaa") = 1
    endwith("abcAaa", "aaa") = 0
    endwith("abcaaa", "abc") = 0
  • exact(text1, text2):检测两组文本是否相同,如果完全相同,返回1;否则返回0,区分大小写
    exact("aaa", "aaa") = 1
    exact("Aaa", "aaa") = 0
  • find(str1, str2, num):从索引num开始,查找字符串str1第一次出现在str2里时的索引;str2里的索引从1开始,num默认值为1
    find("a", "abcde") = 1
    find("bc", "abcde") = 2
    find("a", "abcade", 4) = 4
    find("a", "abcade", 5) = 0
    find("a", "abcade", 7) = 0
    find("a", "abcade", -1)返回空
  • regexp(str, parttern):字符串是否与正则表达式pattern相匹配
    regexp("aaaaccc", "a.*c") = true

4、逻辑函数

  • and(logical1, logical2, ....):当所有参数值为真时,返回1;当任意参数的值为假时,返回0
    and(1=1, 2=2, 3=3) = 1
    and(1=1, 2=3, 3=3) = 0
  • or(logical1, logical2, ....):当所有参数值为假时,返回0;当任意参数的值为真时,返回1
    or(1=2, 2=3, 3=4) = 0
    or(1=1, 2=3, 3=4) = 1
  • not(条件表达式):对条件表达式的结果执行非运算;条件表达输出的结果需为布尔类型或数值类型,不可缺省
    not(1=1) = 0
    not(4) = 0
    not(0) = 1 ;当条件表达式为数值类型时,只有not(0)为1
  • in(exp, para1, para2, ...):判断表达式exp的结果是否属于para1, para2, ...构建的集合里;exp不能为null;in函数中所有参数的类型需保持一致
    in(1, 1, 2, 3) = 1
    in(1, 1, "2", 3) 报错
  • if(exp1, result1, exp2, result2, ..., else_result):如果exp1为真,则返回result1,如果exp2为真且exp1为假,则返回result2,...如果没有为真的exp,则返回else_result;所有result类型必须相同;至少一个exp,result,else_result
    if(50 < 10, "a", 50 < 60, "b", "c") = "b"
  • switch(表达式, 值1, 结果1, 值2, 结果2, ..., 其他结果):如果表达式的结果是值1,返回结果1,如果是值2,返回结果2,如果没有符合要求的值,则返回其他结果;结果必须为相同字段类型;其他结果可以缺省,缺省时没有对应结果时返回空
    switch(4-3, 1, "a", 2, "b", "c") = "a"
    switch(4-0, 1, "a", 2, "b") = null

5、分析聚合函数

  • def(指标, [维度1, 维度2, ...], [过滤条件1, 过滤条件2, ...]):满足过滤条件1、2的明细数据按照[维度1, 维度2, ...]对指标进行聚合运算;第二三参数可以缺省
    def(sum_agg(购买数量), [产品], [是否会员 = "是"]):求会员在产品分组下的购买数量
  • avg_agg():取平均
  • count_agg():计数
  • countd_agg():去重计数
  • max_agg():求最大值
  • min_agg():求最小值
  • median_agg():求中位数
  • sum_agg():求和
  • stdev_agg():求标准差
  • var_agg():求方差
  • earlier:输出上一个视图的计算值。只能用于def、def_add、def_sub中,一般用于行间过滤计算;earlier参数为单个字段,不支持常量作为参数;加上earlier函数过滤后,def函数就很类似mysql开窗函数了
    def(count_agg(购买数量) + 1, [购买数量], [购买数量 < earlier(购买数量)]),计算购买数量的排名 def(sum_agg(购买数量), [序号], [序号 <= earlier(序号)]),计算按照序号大小计算的购买数量的累计值

6、其他函数

  • iferror(value1, value2):判断value1是否是异常值,如果是则返回value2,不是则返回value1;异常值:正无穷、负无穷、NAN(无穷除无穷),不包括空值
    iferror(1, 2) = 1
    iferror(100 / 0, 1) = 1
    iferror(null, 1) = null
  • isnull(objict):判断对象中的值是否是null或者空字符串,为空或者null,返回1,否则返回0
    isnull(null) = 1
    isnull("") = 1
  • nvl(value1, value2, value3, ...):在所有参数中返回第一个不是null的值;当字符串长度为0时,返回也是null
    nvl("", "", "a") = "a"
    nvl(null, 1, 2) = 1
    nvl(null, null) = null

7、补充

7.1、组件->添加计算字段->特有函数

  • acc_sum(x_agg(array), range):x_agg()是sum_agg()函数时,计算的是累加值。range值可为0或1,默认值为0,0-所有行累计,1-组内累计。可使用组件里的分组表测试。
    当只有一个维度时,0,1没有区别,
    当有多个维度,比如[维度A,维度B]时,在A1组内,B1组中0,1数值相同;而到了B2组内,range=0计算的是B1的第一行到当前行的累加值,range=1计算的是B2第一行到当前行的累加值
  • total(x_agg(array), range, agg):x_agg = sum_agg && agg = "sum"时,计算的是总和。range值可为0或1,默认值为0,0-所有行求和,1-组内求和。
    当只有一个维度时,0,1没有区别,
    当有多个维度,比如[维度A,维度B]时,range=0计算的是所有行求和,range=1计算的是各A组的求和