通过上一篇 精读《什么是 LOD 表达式》的学习,你曾经了解了什么是 LOD 表达式。为了坚固了解,联合场景温习是最无效的伎俩,所以这次咱们联合 Top 15 LOD Expressions 这篇文章学习 LOD 表达式的 15 大利用场景,因篇幅限度,本文介绍 1~8 场景。
1. 客户下单频次
各下单次数的顾客数量是多少?
柱状图的 Y 轴显然是 count([customerID])
,因为要统计 以后维度下的客户总数 。
这里插一句,对于柱状图的 Y 轴,在 sql 里就是对 X 轴
group by
后的聚合,因而 Y 轴就是对 X 轴各项的汇总。
柱状图的 X 轴要表白的是以何种粒度拆解,比方咱们是看各城市数据,还是看各省数据。在这个场景下也不例外,咱们要看 各下单次数下的数据 ,那么如何把下单次数转化为维度呢?
咱们须要用 FIX 表达式制作一个维度字段,示意各顾客下单次数。很显然数据库是没有这个维度的,而且这个维度须要依照客户 ID group by 后,依照订单 ID count 聚合能力失去,因而能够利用 FIX 表达式:{fixed [customerID] : count([orderId]) }
形容。
2. 阵列剖析
当咱们看年客户销售量时,即使是逐年增长的,咱们也会有一个疑难: 每年销量中,首单在各年份的顾客别离奉献了多少?
因为关系到老客忠诚度和新客拓展速度,新客与老客差距过大都不好,那咱们如何让 2021 年的柱状图依照 2019、2020、2021 年首单的顾客分层呢?这就是阵列剖析。
咱们要画一个柱状图,X、Y 轴别离是 [Year]
、sum([Sales])
。
为了让柱状图分层,咱们须要一个示意色彩图例的维度字段,比方咱们拖入已有的性别维度,每根柱子就会被划分为男、女两块。但问题是,咱们制作并不存在的“首单年份维度”?
答案是利用 FIX 表达式:{fixed [customerID] : min([orderDate]) }
。
3. 日利润指标
剖析 每年各月份的盈利、亏损天数散布 。如下图:
列是年到月的下钻,比拟好实现,只有拖入字段 [year]
并下钻到月粒度,移除季度粒度即可。
行是“高收益”、“正收益”、“亏损”的透视图,值是在以后月份中天数。
那么如何计算高收益、亏损状态呢?因为最终粒度是天,所以咱们要按天计,首先就要失去每天的利润总和,这些两头过程能够利用 LOD 的字段来实现,即创立一个 日利润字段(profitPerDay):{fixed [orderDate] : sum([profit]) }
。
因为咱们对利润总量不敏感,只心愿拆分为三个阶段,所以利用 IF THEN 生成一个新字段 日利润指标(dailyProfitKPI):IF [profitPerDay] > 2000 THEN "Highly Profitable" ELSEIF [profitPerDay] <= 0 THEN "unprofitable" ELSE "profitable" END
。
所以创立的 [dailyProfitKPI]
指标是个维度,即如果以后行所在的天利润汇总如果大于 2000,值就是 “Highly Profitable”。所以在行上拖入 count(distinct [orderDate])
,把 [dailyProfitKPI]
拖入行的色彩透视即可。
4. 占总体百分比
LOD 表达式的一大特色就是计算跨具体级别的占比,比方咱们要看 欧洲各国的销量在全世界占比 :
显然这个图里所有国家之和不是 100%,因为欧洲加起来也才不到百分之二十,然而在以后具体级别下,是拿不到寰球总销售量的,所以咱们能够利用 FIX 表达式来实现:sum([sales]) / max({sum([sales]) })
。
这里解释两点:
- 之所以用
max
是因为 LOD 表达式只是一个字段,并没有聚合形式,运算必须在雷同具体级别下进行,因为总销量只有一条数据,所以咱们用max
或者min
甚至sum
都行,后果都是一样的。 - 如果不加维度限度,就能够省略“fix”申明,所以
{sum([sales]) }
实际上就是 FIX 表达式,它示意{fixed : sum([sales]) }
。
5. 新客增长趋势
看着年客户增长趋势图,你有没有想过,这个趋势图必定永远是向上的?也就是说,看着趋势图朝上走,不肯定阐明业务做得好。
如果公司每年都比去年倒退的好,每年的新增新客数应该要比去年多,所以 每年新客增长趋势图 才比拟有意义,如果你看到这个趋势图的趋势朝上,阐明每年的新客都比去年多,阐明公司解脱了惯性,每年都取得了新的增长。
所以咱们要加一个筛选条件。新增一个维度字段,当这一单客户是往年新客时为 true,否则为 false,这样咱们筛选时,只看这个字段为 true 的后果就行了。
那么这个字段怎么来呢?思路是,获取客户首单年份,如果首单年份与以后下单年份雷同,值为 true,否则为 false。
咱们利用 LOD 创立首单年份字段 [firstOrderDate]
:{fixed [customerId] : min([orderDate]) }
,而后创立筛选字段 [newOrExist]
: IFF([firstOrderDate] = [orderDate], 'true', 'false')
。
6. 销量比照剖析
入下图条形图所示,右侧是每项依据抉择的分类的比照数据:
对比值计算形式是,用 以后的销量减去以后选中分类的销量 。置信你能够猜到,但前分类的销量与以后视图具体级别无关,只与用户抉择的 Category 无关。
如果咱们曾经有一个度量字段 – 选中分类销量 selectedSales
,应该再排除以后 category 维度的烦扰,所以可用 EXCLUDE 表达式形容 selectedCategorySales
: {exclude [category] : sum([selectedSales]) }
。
接下来是创立 selectedSales
字段。背景常识是 [parameters].[category]
能够取得以后选中的维度值,那咱们能够写个 IF 表达式,在维度等于选中维度时聚合销量,不就是选中销量吗?所以公式是:IF [category] = [parameters].[category] THEN sales ELSE 0 END
。
最初比照差别,只有创立一个 字段,表达式为
sum(sales) - sum(selectedCategorySales)
即可。
7. 均匀最高交易额
如下图所示,以后的具体级别是国家,但咱们却要展现每个国家均匀最高交易额:
显然,要求均匀最高交易额,首先要计算每个销售代表的最高交易额,因为这个具体级别比国家低,咱们能够利用 INCLUDE 表达式计算销售代表最高交易额 largestSalesByRep
: {include [salesRep] : max([sales]) }
,并对这个度量字段求均匀即可。
从这个例子能够看出,如果咱们在一个较高的具体级别,比方国家,此时的 sum([sales])
是依据国家具体级别汇总的,而疏忽了销售代表这个具体级别。但如果要展现每个国家的均匀最高交易额,就必须在销售代表这个具体级别求 max([sales])
,因为是各国家的,所以咱们不必 {fixed [salesRep] }
,而是 {include [salesRep] }
,这样最终计算的具体级别是:[country],[salesRep]
,这样能力算出销售在每个国家的最高交易额(因为兴许某些销售同时在不同国家销售)。
8. 理论与指标
在第六个例子 – 销量比照剖析中,咱们能够看到销量绝对值的比照,这次,咱们须要计算理论销售额与指标的差距百分比:
如上图所示,左上角展现了理论与指标的差值;右上角展现了每个地区产品指标完成率;下半局部展现了每个产品理论销量柱状图,并用彩色横线标记出目标值。
左上角非常简单,[diffActualTraget]
: [profit] - [targetProfit]
,只有将以后利润与指标利润相减即可。
右上角须要分为几步拆解。咱们的最终目标是计算每个地区产品指标完成率,显然公式是 以后实现产品数 / 总产品数。总产品数比较简单,在已有地区维度拆解下,计算下产品总数就行了,即 count(distinct [product])
;难点是以后实现产品数,这里咱们又要用到 INCLUDE,为什么呢?因为地区粒度比产品粒度高,咱们看地区汇总的时候,就不晓得各产品的实现状况了,所以必须 INCLUDE product 维度计算利润指标差,公式是 [diffProductActualTraget]
:{include [product] : sum(diffActualTraget) }
,而后当这个值大于 0 就认为实现了指标,咱们能够再创立一个字段,即实现指标数,如果达成指标就是 1,否则是 0,这样便于求“以后实现产品数”:aboveTargetProductCount
: IFF([diffProductActualTraget] > 0, 1, 0)
,那么以后实现产品数就是 sum([diffProductActualTraget])
,所以产品指标完成率就是 sum([diffProductActualTraget]) / count(distinct [product])
,将这个字段拖入指标,依照百分比格式化,就失去后果了。
总结
通过下面的例子,咱们能够总结出理论业务场景中几条应用心法:
- 首先对计算公式进行拆解,判断拆解后的字段是否数据集里都有,如果都有的话就完结了,阐明是个简略需要。
- 如果数据集里没有,而且发现数据具体级别与以后不符(比方要失去每个国家销量,但以后维度是城市),就要用 FIXED 表达式固定具体级别。
- 如果不是明确的依照某个具体级别计算,就不要应用 FIXED,因为不太灵便。
- 当计算时要跳过某个指定具体级别,但又要保留视图里的具体级别时,应用 EXCLUDE 表达式。
- 如果计算波及到比视图低的具体级别,比方计算均匀或者最大最小时,应用 INCLUDE 表达式。
- 应用 FIXED 表达式创立的字段也能够进行二次计算,正当拆解多个计算字段并组合,会让逻辑更加清晰,易于了解。
探讨地址是:精读《15 大 LOD 表达式 – 上》· Issue #369 · dt-fe/weekly
如果你想参加探讨,请 点击这里,每周都有新的主题,周末或周一公布。前端精读 – 帮你筛选靠谱的内容。
关注 前端精读微信公众号
<img width=200 src=”https://img.alicdn.com/tfs/TB165W0MCzqK1RjSZFLXXcn2XXa-258-258.jpg”>
版权申明:自在转载 - 非商用 - 非衍生 - 放弃署名(创意共享 3.0 许可证)