Skip to content

公式列表

通过新增公式可以在搜索时丰富搜索结果,新增公式的具体操作如下:

(1)在搜索模块点击左下角“增加公式”按钮会弹出一个公式填写界面;

(2)在空白栏中输入要用的公式。本模块还设计了公式辅助功能,免除用户去记忆繁多的公式函数,仅需要点出辅助框,按分类索引引用即可,如图13-1所示。鼠标悬停在公式上,下方会出现对于该公式的解释说明以及样例;

(3)编写好的公式可以自己命名,点击公式名,对公式名字进行编辑(不能与关键词同名);

(4)若公式计算的最终结果是数值,则在公式输入框下方的“高级设置”中可以修改该公式的聚合方式及列类型;

(5)公式输入正确后点击确定,该公式便会添加在数据表的最下方;

(6)双击该公式即可将公式加入到搜索框内,公式计算结果会显示在结果中。

图13-1 添加公式辅助

公式模块也配备了和搜索相似的智能输入功能,在书写公式前,点击小慧,在公式描述中输入尽可能准确的自然语句,然后点击“生成公式”,即可完成对公式的快捷输入,如图13-2所示。

图13-2 小慧公式生成

聚合函数

聚合函数包括了8种基本聚合方式和累积、分组、范围等条件聚合函数。8种基本聚合方式分别为平均值(average)、计数(count)、最大值(max)、最小值(min)、标准差(stddev)、总和(sum)、方差(variance)、去重计数(unique_count)。同时可以引申出按条件聚合的公式,分别为按条件求平均值(average_if)、按条件计数(count_if)等。

属性列在需要聚合的情况下,仅支持计数(count)、去重计数(unique_count)两种聚合方式。系统默认数值列的聚合方式为总和,属性列无聚合方式。用户可以在搜索的同时在搜索框内直接限定数据列的聚合方式,也可以在数据管理的对应数据表详情中修改默认聚合方式。

在公式计算时,遇到需要修改聚合方式的情况,就可以使用聚合函数直接进行修改,比如数据表中有销售金额、销售数量、进货价格三个数值列(默认聚合方式均为总和),如果想查看单个产品实际销售售价(即“销售金额/销售数量”)和进货价格的差值,即单品的每件销售利润,这里就需要对“销售额/销售数量”进行聚合修改(如图13-3和图13-4),否则会出现错误(如图13-5)。

图13-3 对计算结果进行聚合修改

图13-4 对计算结果未进行聚合修改

图13-5 错误聚合示例

所以用户在进行数据分析时,尤其是公式辅助分析时,要关注数据的聚合方式,确保数据准确性,并且善用聚合函数来对聚合方式进行灵活的转化。

表13-1 聚合函数表

公式说明样例
approx_distinct高效率带误差的计算指定列的行数approx_distinct(产品名称)
approx_distinct_if高效率带误差的计算按条件求指定列的行数approx_distinct_if(进货价格>8,产品名称)
average求度量的平均值average(销售数量)
average_if按条件求平均值average_if(进货价格>8,销售数量)
count返回指定列的行数count(产品名称)
count_if按条件计数count_if(进货价格>8,销售数量)
max求度量的最大值max (销售数量)
max_if按条件求最大值max_if (进货价格>8,销售数量)
min求度量的最小值min (销售数量)
min_if按条件求最小值min_if (进货价格>8,销售数量)
stddev求度量的标准差stddev (销售数量)
stddev_if按条件求标准差stddev_if(进货价格>8,销售数量)
sum对度量求和sum (销售数量)
sum_if按条件求和sum_if(进货价格>8,销售数量)
unique_count对属性或者度量进行非重复计数unique count (产品名称)
unique_count_if按条件求非重复计数unique_count_if(进货价格>8,销售数量)
variance求度量的方差variance(销售价格)
variance_if按条件求均方差variance_if(进货价格>8,销售数量)

分析函数

数据分析中有时会遇到一类指标是需要进行滚动统计的,比如说累计求和、分组求和、移动平均值等。分析函数就可以实现这一类的需求。如图13-6所示,可以通过“group_sum”函数计算销售金额按照不同的产品子类别、不同的目的省份的和。但要注意的是,因为得出的结果是非聚合的,不能直接绘制柱状图、环图等图形,需要先保存为中间表再进行绘图。

图13-6 分析函数分组求和

表13-2 分析函数表

公式说明样例
cumulative_average输入一个度量和一个或多个属性。

求按指定属性排序后的各行累积平均值
cumulative_average(销售数量,订单日期, 产品类别)

注:按订单日期排序后再按产品类别排序的累积平均销售数量。
cumulative_count输入一个度量和一个或多个属性求按指定属性排序后的各行累积行数cumulative_count (销售数量,订单日期, 产品类别)
cumulative_max输入一个度量和一个或多个属性,求按指定属性排序后的各行累积最大值cumulative_max(销售数量,订单日期, 产品类别)
cumulative_min输入一个度量和一个或多个属性,求按指定属性排序后的各行累积最小值cumulative_min (销售数量,订单日期, 产品类别)
cumulative_stddev输入一个度量和一个或多个属性,求按指定属性排序后的各行累积标准差cumulative_stddev (销售数量,订单日期, 产品类别)
cumulative_sum输入一个度量和一个或多个属性,求按指定属性排序后的各行累积总和cumulative_sum (销售数量,订单日期, 产品类别)
cumulative_variance输入一个度量和一个或多个属性,求按指定属性排序后的各行累积方差cumulative_variance(销售数量,订单日期, 产品类别)
group_average输入一个度量和多个属性,求按指定属性分组后度量的平均值group_average(销售数量,订单日期, 产品类别)

注:各订单日期内的各产品类别的平均销售数量。
group_count输入一个度量和多个属性,求按指定属性分组后度量的计数group_count(销售数量,订单日期, 产品类别)
group_max输入一个度量和多个属性,求按指定属性分组后度量的最大值group_max (销售数量,订单日期, 产品类别)
group_min输入一个度量和多个属性,求按指定属性分组后度量的最小值group_min (销售数量,订单日期, 产品类别)
group_stddev输入一个度量和多个属性求按指定属性分组后度量的标准差group_stddev(销售数量,订单日期, 产品类别)
group_sum输入一个度量和多个属性,求按指定属性分组后度量的和group_sum (销售数量,订单日期, 产品类别)
group_variance输入一个度量和多个属性求按指定属性分组后度量的方差group_variance(销售数量,订单日期, 产品类别)
moving_average移动平均值

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的平均值

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_average(进货价格,7,6,订单日期)
moving_count移动计数

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的计数

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_count(进货价格,7,6,订单日期)
moving_max移动最大值

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的最大值

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_max(进货价格,7,6,订单日期)
moving_min移动最小值

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的最小值

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_min(进货价格,7,6,订单日期)
moving_stddev移动求标准差

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的标准差

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_stddev(进货价格,7,6,订单日期)
moving_sum移动求和

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的和

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_sum(进货价格,7,6,订单日期)
moving_variance移动求方差

输入一个度量和一个或者多个属性,两个数字(定义窗口范围)分析度量的方差

第一个数字为当前位置向上移动的行数,第二个数字为向下移动的行数
moving_variance(进货价格,7,6,订单日期)
row_number生成一个根据指定列排序的行号列

统计函数

统计函数计算的是统计学中常用到的一些专业名词,例如众数、中位数、百分位数等。

表13-3 统计函数表

公式说明样例
kurtosis返回所有输入值的超额峰度,返回doublekurtosis(销售价格)
median计算中位数,返回列类型与a一致median(销售数量)
mode计算众数,返回列类型与a一致mode(销售金额)
percentile任意百分位数percentile(销售金额)
skewness返回所有输入值的偏斜度的Fisher矩系数,返回doubleskewness(销售金额)

变换函数

类型转换函数用于对数据类型进行转换,系统支持转化为5种数据类型,分别是布尔型、日期型、浮点型、整数型和字符型。

在业务中,用户可以将数值型的数据列转化为字符型(to_string),然后作为属性列进行搜索;也可以将转化后的数据列作为参数在公式中嵌套使用。例如将指定字段转化为布尔型,如图13-7。

图13-7 布尔型转换

类型转换函数还有各种应用场景,都可以根据需求灵活使用,也支持结合其他函数进行嵌套使用。

表13-4 变换函数表

公式说明样例
to_bigint把指定的数字转换为bigint类型to_integer (订单单号)
to_bool转换对应的数字为boolean类型to_bool (9.37)
to_date把指定的数字和字符串类型的日期值转换成日期格式(impala只支持'%Y-%m-%d %H:%M:%S' 格式的字符串转换)to_date (10.07)
to_decimal把指定的输入转为带精度的浮点数to_decimal ( 销售金额, 2, 5)
to_double把指定的数字转换为double类型to_double (订单单号)
to_integer把指定的数字转换为integer类型to_integer (订单单号)
to_string把指定的输入转为字符串to_string (订单日期)

日期函数

时间日期函数是针对时间列的函数,可以对时间列进行各种统计、计算。比如:你可以计算某一时间日期是一周内的星期几,是不是周末,是几月、第几个季度,等等;也可以计算一整列中的每一天距离某一个日期的天数,这在计算用户活跃度中的最近一次上线间隔天数这种指标时非常方便;也可以计算该日期的年份、月份、季度数目。如图13-8所示,计算签收至发货之间的运输天数。

图13-8 计算日期差

表13-5 日期函数表

公式说明样例
abbrv_month时间列转英文月缩写abbrv_month(订单日期)
abbrv_week时间列转英文周缩写abbrv_week(订单日期
add_days为日期列增加天数add_days (订单日期,8)
add_hours为日期列增加小时数add_hours (订单日期,8)
add_minutes为日期列增加分钟数add_minutes(订单日期,8)
add_months为日期列增加月数add_months(订单日期,8)
add_quarters增加N季度add_quarters(订单日期,2)
add_seconds为日期列增加秒数add_seconds (订单日期,8)
add_weeks为日期列增加周数add_weeks(订单日期,8)
add_years为日期列增加年数add_years(订单日期, 8 )
date计算指定时间的日期部分date(订单日期)
date_parse指定的日期格式字符串进行输出date_parse("2025-09-08 18:13:33",'%Y-%m-%d %H:%i:%S')
day计算指定时间是月内的哪一天(1~31)day(订单日期)
day_number_of_quarter计算指定时间是季度内的哪一天day_number_of_quarter (订单日期)
day_number_of_week计算指定时间是周内的哪一天(1~7对应周一到周日)day_number_of_week (订单日期)
day_number_of_year计算指定时间是年内的哪一天(1~366)day_number_of_year (订单日期)
day_of_week计算指定时间是周几(Monday~Sunday)day_of_week (订单日期)
diff_days用前一个日期减后一个日期计算天数的差值,差值超过12小时算一天diff_days(签收日期,发货日期)
diff_time用前一个日期减后一个日期计算秒数差值diff_time(发货日期,订单日期)
hour_of_day计算时间是当天的几点(0~23)hour_of_day(订单日期)
is_weekend指定日期是否是周末is_weekend(订单日期)
month计算指定月份(January~December)
month_number计算指定日期是当年的第几个月(1~12)month_number (订单日期)
month_number_of_quarter计算指定日期是当前季度的第几个月(1~3)month_number_of_quarter (订单日期)
now获取当前时间now( )
quarter返回季度数month(订单日期)
start_of_day计算指定日期所属日的开始日期start_of_day(订单日期)
start_of_month计算指定日期所属月的开始日期start_of_month(订单日期)
start_of_quarter计算指定日期所属季度的开始日期start_of_quarter (订单日期)
start_of_week计算指定日期所属周的开始日期start_of_week (订单日期)
start_of_year计算指定日期所属年的开始日期start_of_year (订单日期)
time计算指定日期的时间部分time(订单日期)
week_number_of_month计算指定时间是月内的哪一周(1~6)

注:按电子日历从周一至周日
week_number_of_week (订单日期)
week_number_of_quarter计算指定时间是季度内的哪一周(1~15)

注:按电子日历从周一至周日
week_number_of_quarter (订单日期)
week_number_of_year计算指定时间是年内的哪一周(1~53)

注:按电子日历从周一至周日
week_number_of_year (订单日期)
year计算指定日期年份year (订单日期)

关系函数

混合函数是用于对数值比较进行判断的函数,主要分两种:一种是判断两个值的关系,如“<”“>=”“!=”等,根据判断结果返回true或false;第二种是判断两个值的大小,返回较大/较小的一个值。该函数常和其他函数一起使用,作为参数被调用,或者单独作为比较返回较大/较小值使用。

表13-6 关系函数表

公式说明样例
!=如果两值不等返回true否则返回false销售数量 != 10000
<如果前一个值小于后一个值返回true否则返回false销售数量 < 10000
<=如果前一个值小于等于后一个值返回true否则返回false销售数量 <= 10000
=如果两值相等返回true否则返回false销售数量 = 10000
>如果前一个值大于后一个值返回true否则返回false销售数量 > 10000
>=如果前一个值大于等于后一个值返回true否则返回false销售数量 >= 10000
greatest返回两值中较大的值greatest ( 进价 , 售价 )
least返回两值中较小的值least ( 进价 , 售价 )

数学函数

数字函数是公式中最基础也是使用最广泛的一类,用于对数值进行计算,如加减乘除、三角运算、多次乘方、绝对值、取整等等,还有一些复杂运算,如数学和三角函数,以及部分统计函数,满足各种数值计算需求。

这一部分在做数据分析经常用到,比如计算各种财务数据或者运营指标等等。图13-9中使用一个简单的例子来进行演示,已知每种货品的销售量、售价和进货价格,求该类货品的毛利。

图13-9 用数字函数计算数值

表13-7 数学函数表

公式说明样例与结果
*求两值的乘积2*6
+求两值的和1+5
-求两值的差8-2
/求两值的商12/2
^乘方5^2=25
abs求绝对值abs(-5)=5
acos反余弦acos(0.5)
asin反正弦asin(0.5)
atan反正切atan(1)
atan2反正切atan2(1,2)
cbrt立方根cbrt(27) = 3
ceil返回大于等于指定数字的最小整数ceil(5.9) = 6
corr相关系数corr(进货价格,折扣促销)
cos余弦cos(0.5)
cosh双曲余弦函数Cosh(7)
covar_pop总体协方差covar_pop(运输成本,折扣促销)
covar_samp样本协方差covar_samp(运输成本,折扣促销)
cube立方cube(3) = 27
degree弧度转角度degree(29)
exp自然常数e的乘方exp(2)
exp22的乘方exp2(3)=8
floor返回小于等于指定数字的最大整数floor(3.1)=3
ln自然对数ln(3)
log对数函数log(7,2)
log10以10为底的对数log10(3)
log2以2为底的对数log2(3)
mod求模mod(8,3)=2
pi圆周率pipi()
pow乘方pow(2,3)=8
radians角度转弧度radians(5)
random0~1之间的随机数random()
round四舍五入round( 36.355 ,2)=36.36
safe_divide安全除法,防止除于0时报错的问题safe_divide(销售金额,销售数量)
sign如果数字大于零返回1小于零返回-1等于0返回0sign(-50)
sin正弦sin(0.5)
sq平方sq(8)
sqrt开方sqrt(64)
std_pop总体标准std_pop(销售数量)
tan正切tan(0.5)
tanh双曲正切函数tanh(21)
var_pop总体方差var_pop(销售金额)

逻辑函数

逻辑函数用于进行逻辑判定和逻辑运算。独立使用比较少见,多用于和其他函数结合,在判断条件中调用。

其中的“if…then…else”函数常用于进行特殊分组分群,例如将销售金额按一定的条件区分,就是很常见的应用场景,如图13-10。

图13-10 if公式划分是否为大额订单

表13-8 逻辑函数表

公式说明样例
if..then..else逻辑判断if 销售价>=500 then “高价格” else ”低价格”
and并逻辑运算X=1 and X>3
ifnull如果值1为null返回值2,否则返回值1ifnull(cost, 'unknown')
isnotnull判断是否不为空isnotnull(订单单号)
isnull如果值为null返回true否则返回falseisnull(null) = true
not非逻辑运算not (2>3) = true
or或逻辑运算X=1 or X>3

文本函数

字符串函数用于对字符进行连接、剪切、匹配等操作,可以将几个零散的字符列拼接成完整易用的一个字符列,或者是从一个长串字符列中截取我们需要的部分。例如将“产品类别”和“产品子类别”使用concat命令拼接成“产品类别全称”,如图13-11所示。

图13-11 字符串拼接

表13-9 文本函数表

公式说明样例与结果
begins_with如果字符串1以字符串2开头返回true否则返回falsebegins_with("example","exa") = true

begins_with ( 姓名, "赵" , "钱" , "孙" )
concat字符串链接操作concat("test" , "123" )=test123

concat(产品类别,"的" ,产品名称)
contains如果字符串1包含字符串2返回true否则返回falsecontains (“broomstick”, “room”) = true

contains(姓名, "赵" , "钱" , "孙")
ends_with如果字符串1以字符串2结尾返回true否则返回falseends_with("example","ple") = true

ends_with ( 姓名, "赵" , "钱" , "孙" )
extract返回字符串中与正则表达式匹配的部分。

在使用时,第一个输入项为待匹配字段,第二个字段内可输入正则表达式,第三个输入项确定使用哪个匹配值。
extract(“我父亲的手机号是13812345678,母亲的手机号是19187654321”,“1[3-9]\d{9}”)

注:当不输入第三个输入项时,默认获取第一个配置值,因为上述公式的结果为13812345678;
若要获取的是母亲的手机号,则公式应该为:
【extract(“我父亲的手机号是13812345678,母亲的手机号是19187654321”,“1[3-9]\d{9}”,2)】
init_cap首字母大写init_cap(region)
join以分隔符连接2个及以上字符串join(",",区域,目的城市)
left返回开头指定数量的字符串left(产品名称,6)
left_pad左填充left_pad(快递公司,5,“快递-”)
levenshtein_distance计算两个字符串的相似度levenshtein_distance(City,Product_ID)
like模糊匹配字符串like(产品名称,”甘栗仁100g”)
not_begins_with如果字符串1不以字符串2开头返回true否则返回falsenot_begins_with("example","exa") = false

not_begins_with ( 姓名, "赵" , "钱" , "孙" )
not_contains如果字符串1不包含字符串2返回true否则返回falsenot_contains (“broomstick”, “room”) = false

not_contains ( 姓名, "赵" , "钱" , "孙" )
not_ends_with如果字符串1不以字符串2结尾返回true否则返回falsenot_ends_with("example","ple") = false

not_ends_with ( 姓名, "赵" , "钱" , "孙" )
not_like模糊反匹配字符串not_like(产品名称,”甘栗仁100g”)
remove_digits剔除文本中数字remove_digits(产品名称)
replace将字符串1中的字符串2替换为字符串3replace(快递公司,“EMS”,“邮政”)
reverse把输入的字符串反转reverse(产品名称)
reverse("tiger")
right返回末尾指定数量的字符串right(产品名称,3)
right_pad右填充right_pad(快递公司,4,“快递”)
split把输入的字符串拆分成多个字符串,

split(字符串,分隔符,需要返回的第N部分)
split(整合字段,”-”,2)
str_case判断两个值是否完全一致(忽略大小写)str_case(“datafocus”,产品名称)
str_digits提取文本中数字str_digits(产品名称)
str_similarity判断两个字符串的相似度(0~1)str_similarity(产品名称,产品类别)
strlen字符串长度strlen (“smith”) = 5
strlower把输入的字符串转为小写strlower("EXAMPLE" )=example
strpos第二个字符串在第一个字符串中出现的位置strpos (“haystack_with_needles”, “needle”) = 14
strupper把输入的字符串转为大写strupper(“example”)=EXAMPLE
substitute根据下标替换字符串内容substitute("China",4,5,"ese")
substr获取字符串子串substr (“persnickety”, 4, 7) = snicket
trim移除字符串两侧空格trim(顾客姓名)
unichar将转换成unicode的字符再次进行转换,结合unicode的一起使用可提取字符串首字母unichar(unicode(顾客姓名))
unicode提取出字符串首字母,然后转换unicodeunicode(顾客姓名)
unique_concat字符串聚合连接去重后的值unique_concat("world",产品名称)

公式嵌套

在实际业务场景中,常常遇到使用某个之前创建过的公式的情况,如果再输入一遍会导致公式逻辑比较复杂,这里就需要用到公式嵌套功能了。顾名思义,公式嵌套就是在当前创建的公式中使用之前创建过的公式。

DataFocus系统除了极为稀少的一些为了避免数据错误的场景,比如对含有计数(count)聚合或去重计数(unique_count)聚合的公式进行再聚合的场景,其他正常的公式嵌套都是可以使用的,公式中的智能提示也会将之前的公式纳入补全选择。

以下将从一些实际的使用场景帮助用户了解公式的叠加和嵌套:

示例1

当下有一份数据表,登记了用户购买商品的记录,根据购买频次对用户进行分级,区分重要价值客户、潜力客户、一般客户和新客户。根据上述需求,先对用户的购买次数进行计数,计算出用户的购买频次,如图12-1,然后使用逻辑函数将用户按照购买频次进行分级,公式如图13-13所示。

txt
【用户分级】

if(购买频次)>10 then"重要价值用户" 
else if(购买频次)>5 and(购买频次)<=10 
then"潜力用户" 
else if(购买频次)<=5 and(购买频次)>=2 
then"一般客户" 
else"新客户"

图13-12 计数用户购买频次

图13-13 逻辑函数对用户分级

示例2

这是一份物流相关的数据,如图13-14所示。数据表记录了订单的货物名称、类别、优先级等基本信息,以及订购数量、发货数量、交货日期等于物流运输相关的内容。

图13-14 物流数据预览

在此基础上,希望计算出2020年基于2019年的销售利润增长值(可以类比计算本年基于上一年的销售情况)。首先我们用year公式将订购日期中的年分值取出,然后用sum_if按条件进行求和,分别合计出2020和2019年的利润额,再配合数学函数进行相除,即可得到结果,如图13-15所示。

txt
【利润增长率】
(sum_if(year(订购日期)=2020,利润)-sum_if(year(订购日期)=2019,利润))/sum_if(year(订购日期)=2019,利润)

图13-15 2020与往年同期相比利润年增长率

当订单的实际交货日期在预计时间内,我们定义订单是准时送达的。由此计算订单的准时率,对订单ID进行按条件非重复的计数,再使用安全除法计算符合条件的订单数占总体的百分比,即可得到准时率,如图13-16所示。

txt
【订单准时率】
safe_divide(unique_count_if(实际交货日期<=预计送达日期,订单ID),unique_count(订单ID))

图13-16 订单准时率

将订单的订购数量与发货数量和交货数量完全相同的订单称为完美订单,计算所有订单中完美订单的比率情况。参考上一个公式,这里使用数学函数的“/”或者安全除法safe_divide都是可以的,如图13-17所示。

txt
【完美订单率】
unique_count_if(订购数量=发货数目and交货数目=发货数目,订单ID)/unique_count(订单ID)

图13-17 完美订单率计算