公式列表
通过新增公式可以在搜索时丰富搜索结果,新增公式的具体操作如下:
(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 | 返回所有输入值的超额峰度,返回double | kurtosis(销售价格) |
| median | 计算中位数,返回列类型与a一致 | median(销售数量) |
| mode | 计算众数,返回列类型与a一致 | mode(销售金额) |
| percentile | 任意百分位数 | percentile(销售金额) |
| skewness | 返回所有输入值的偏斜度的Fisher矩系数,返回double | skewness(销售金额) |
变换函数
类型转换函数用于对数据类型进行转换,系统支持转化为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) |
| exp2 | 2的乘方 | 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 | 圆周率pi | pi() |
| pow | 乘方 | pow(2,3)=8 |
| radians | 角度转弧度 | radians(5) |
| random | 0~1之间的随机数 | random() |
| round | 四舍五入 | round( 36.355 ,2)=36.36 |
| safe_divide | 安全除法,防止除于0时报错的问题 | safe_divide(销售金额,销售数量) |
| sign | 如果数字大于零返回1小于零返回-1等于0返回0 | sign(-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,否则返回值1 | ifnull(cost, 'unknown') |
| isnotnull | 判断是否不为空 | isnotnull(订单单号) |
| isnull | 如果值为null返回true否则返回false | isnull(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否则返回false | begins_with("example","exa") = true begins_with ( 姓名, "赵" , "钱" , "孙" ) |
| concat | 字符串链接操作 | concat("test" , "123" )=test123 concat(产品类别,"的" ,产品名称) |
| contains | 如果字符串1包含字符串2返回true否则返回false | contains (“broomstick”, “room”) = true contains(姓名, "赵" , "钱" , "孙") |
| ends_with | 如果字符串1以字符串2结尾返回true否则返回false | ends_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否则返回false | not_begins_with("example","exa") = false not_begins_with ( 姓名, "赵" , "钱" , "孙" ) |
| not_contains | 如果字符串1不包含字符串2返回true否则返回false | not_contains (“broomstick”, “room”) = false not_contains ( 姓名, "赵" , "钱" , "孙" ) |
| not_ends_with | 如果字符串1不以字符串2结尾返回true否则返回false | not_ends_with("example","ple") = false not_ends_with ( 姓名, "赵" , "钱" , "孙" ) |
| not_like | 模糊反匹配字符串 | not_like(产品名称,”甘栗仁100g”) |
| remove_digits | 剔除文本中数字 | remove_digits(产品名称) |
| replace | 将字符串1中的字符串2替换为字符串3 | replace(快递公司,“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 | 提取出字符串首字母,然后转换unicode | unicode(顾客姓名) |
| unique_concat | 字符串聚合连接去重后的值 | unique_concat("world",产品名称) |
公式嵌套
在实际业务场景中,常常遇到使用某个之前创建过的公式的情况,如果再输入一遍会导致公式逻辑比较复杂,这里就需要用到公式嵌套功能了。顾名思义,公式嵌套就是在当前创建的公式中使用之前创建过的公式。
DataFocus系统除了极为稀少的一些为了避免数据错误的场景,比如对含有计数(count)聚合或去重计数(unique_count)聚合的公式进行再聚合的场景,其他正常的公式嵌套都是可以使用的,公式中的智能提示也会将之前的公式纳入补全选择。
以下将从一些实际的使用场景帮助用户了解公式的叠加和嵌套:
示例1
当下有一份数据表,登记了用户购买商品的记录,根据购买频次对用户进行分级,区分重要价值客户、潜力客户、一般客户和新客户。根据上述需求,先对用户的购买次数进行计数,计算出用户的购买频次,如图12-1,然后使用逻辑函数将用户按照购买频次进行分级,公式如图13-13所示。
【用户分级】
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所示。
【利润增长率】
(sum_if(year(订购日期)=2020,利润)-sum_if(year(订购日期)=2019,利润))/sum_if(year(订购日期)=2019,利润)
图13-15 2020与往年同期相比利润年增长率
当订单的实际交货日期在预计时间内,我们定义订单是准时送达的。由此计算订单的准时率,对订单ID进行按条件非重复的计数,再使用安全除法计算符合条件的订单数占总体的百分比,即可得到准时率,如图13-16所示。
【订单准时率】
safe_divide(unique_count_if(实际交货日期<=预计送达日期,订单ID),unique_count(订单ID))
图13-16 订单准时率
将订单的订购数量与发货数量和交货数量完全相同的订单称为完美订单,计算所有订单中完美订单的比率情况。参考上一个公式,这里使用数学函数的“/”或者安全除法safe_divide都是可以的,如图13-17所示。
【完美订单率】
unique_count_if(订购数量=发货数目and交货数目=发货数目,订单ID)/unique_count(订单ID)
图13-17 完美订单率计算