随着时代和市场的发展,BI工具在当今世界企业的发展和前进中正在变得越来越不可或缺。QlikView和Qlik Sense作为BI领域的个中翘楚,被运用的也越来越广泛。在Qlik关联引擎技术支撑下,结合Qlik独有的“绿白灰”概念,我们在日常的分析中,可以轻松实现筛选,然后基于当前的筛选结果,得到我们想要的分析结果。
然而,在更加高级的分析中,我们可能经常要实现跟当前选择项不完全相同的计算需求。这时候,我们需要利用到集合分析。
何为集合分析
众所周知,在计算分析中,我们常用到的函数,包括sum,max,min,count等等都被称之为聚合函数,是指这些函数对一组值执行计算并返回单一的值。集合分析就是指在这个聚合过程中对聚合的范围(集合)加以限定。
集合分析的格式规范
以一个简单的事实表为例:
1. 我们想计算种类为鞋子的商品的总销售额,表达式:
sum({<Category={'Shoes'}>}Sales)
以此,我们可以引出集合分析表达式的基本结构:
聚合函数:sum(),max(),min()等等
最终被计算的字段:Sales
对聚合范围的限定:{ }
需要具体进行限定的字段:<Category(需要被限定范围的字段名称)={具体限定范围}>}
格式: <字段名称={字段范围}>(称之为集合修饰符)
字段范围中的值若为字符需要用单引号(大多数情况不加也能识别,但请一律加上......),有多个值用逗号隔开,对多个字段进行限定,再加逗号,如:
<Product={'A','B','C'},Category={'Shoes'},Date=>
注:"字段=" 表示的范围为字段所有值的集合。
集合标识符
1. 在QlikView和Qlik Sense(以下简称Qlik)中,我们用常数“1”代表应用中的所有记录,当前的选择项也是一个集合,我们用符号“$”表示。自然的,“1-$”意味着当前选择项的反选,即不包括当前选择项的所有记录。集合标识符的位置位于集合修饰符之前,如:
{1-$<字段名称={字段范围}>}, sum(1-${<Category={'Shoes'}>}Sales)
{1<字段名称={字段范围}>}, sum(1{<Category={'Shoes'}>}Sales)
{$<字段名称={字段范围}>}, sum(${<Category={'Shoes'}>}Sales)
省略集合标识符视为基于当前选择项,即sum({<Category={'Shoes'}>}Sales)
等同于sum(${<Category={'Shoes'}>}Sales)
2.应用实例,基于前面用到的事实表。
(a).加上标识符1:sum({1<Category={'Shoes'}>}Sales)
此时,可以看到在进行日期的筛选后,记录已变为两条,
之前的表达式值已由600变为350,而加上标识符1的表达式值仍保持600,筛选其他维度结果也一样(即在表达式的计算逻辑中,忽略了所有当前选择项,只保留了集合分析表达式内的范围限定)
(b).加上标识符$(当前选择项),1-$(当前选择项的反选)
此时,可以看到在进行产品的筛选后,记录已变为四条,第一个的表达式结果为450,是前两条数据002,003的加总,即加总的范围由当前筛选项Product和集合分析中Category的交集组成。
加上$,如第二个表达式,结果相同;
加上1-$,如第三个表达式,加总的范围为并集的反选,结果为1950,即去除002,003后剩余的数据汇总,如图:
集合运算符
(a).在第3点的介绍中,我们知道当使用集合标识符"1"时,聚合的范围只与表达式中的字段限制相关,当使用集合标识符"$"时,是基于当前选择项与表达式中字段限制的交集。那在当前选择项中对某一维度进行筛选,同时在集合分析表达式中也对该维度进行限制时,在Qlik中是怎么进行逻辑运算的呢?
此时,相当于将当前选择项中的该维度清除来进行计算。如图:
我们在筛选框中对Category选中Clothes,但计算的结果依然是基于Category=Shoes的加总。相当于Category的筛选框未进行任何筛选。
(b).如果我们希望该维度的当前选择也对最终的结果产生影响,该如何实现呢?例如我想根据Product维度来进行汇总,需要最终的结果是在当前选择项的基础上永远加上Product=F.
此时,需要引入集合运算符。例:sum({<Product+={'F'}>}Sales),以"+="来定义集合运算的并集,即当前选择项加上表达式中范围限制。
如图,当前选择项的和为750,加上Product=F时的700,共计1450。
同理,当希望不论筛选项如何变动,都排除某一维度值时,使用"-="。
即:"+="定义并集,"-="定义补集,"*="定义交集,"/="定义对称差集。
集合修饰符
在集合分析的格式规范中,我们有提到,对某些字段的具体限制的表达式部分我们简称为集合修饰符。如图:
在之前的例子中我们使用字段范围都是某个值或某几个值,如:
<Product={'A','B','C'}>,在实际使用中,我们可能需要通过某个范围或者表达式来实现对字段范围的限定。由于文章篇幅有限,这里就直接给出实例:sum({<Date={"<=$(=max(Date))"}>}Sales)
范围:<=; 表达式:max(Date)
注意:1.运用表达式时需记住“$”和“=”。
2.对范围值进行限定时,使用双引号""(即使单引号一般也能识别)。
计算日期小于等于所选最大日期的销售额总和。
又如:sum({<Date={"<=$(=num('2016/8/1'))>=$(=num('2016/7/30'))"}>}Sales)。
集合分析的入门篇就先简单介绍到这里。更多精彩内容请关注后续的集合分析进阶篇,包括:集合分析中对变量,模糊匹配,高级搜索,书签,替代状态,基于另一字段的范围值,元素函数P()/E()的运用以及在集合修饰符中进行集合的运算(包括集合运算的优先顺序),集合分析中OR条件的实现等等。
总结:通过集合分析,我们可以更加自由的完成自己的分析目标,不再仅仅拘泥于当前的选择项,可以更加随心所欲的驾驭我们所掌握的数据,真正释放出数据所蕴含的价值和分析潜力,实现更加高效的自助式分析!
亦策软件
EBIStrategy
一家国内领先的专注于大数据整体解决方案的高科技企业,
为客户提供大数据分析平台端到端的解决方案。
咨询电话:400-676-1711