通过前面精读《什么是 LOD 表达式》的学习,你已经明白什么是LOD表情了。为了巩固理解,结合场景复习是最有效的手段,所以这次我们结合Top15LODExpressions一文来学习LOD表情的15个应用场景。限于篇幅,本文介绍1-8个场景。1.每个订单频率的客户数量是多少?直方图的Y轴显然是count([customerID]),因为要统计当前维度下的客户总数。这里插一句,对于直方图的Y轴,在SQL中,是X轴经过groupby后的聚合,所以Y轴就是X轴的汇总。直方图的X轴应该表示拆解的粒度,比如我们是看每个城市的数据,还是看每个省的数据。这种情况也不例外。我们要看每个订单号下的数据,那么订单数如何转化为维度呢?我们需要用FIX表达式做一个维度字段来表示每个客户下的订单数。显然,数据库没有这个维度,这个维度需要根据customerIDgroupby后的orderIDcount进行聚合,所以可以用FIX表达式来描述:{fixed[customerID]:count([订单号])}。2、数组分析当我们看每年的客户销量,即使是逐年增长,我们也会有一个疑问:在每年的销量中,每一年下第一单的客户分别贡献了多少??因为关系到老客户的忠诚度和新客户拓展的速度,新老客户差距过大也不好,那么2021年的柱状图怎么根据来的客户分层呢?2019年、2020年和2021年首次订购?这是数组分析。我们要画一个直方图,X轴和Y轴分别是[Year],sum([Sales])。为了对直方图进行分层,我们需要一个表示颜色图例的维度字段。比如我们拖入已有的性别维度,每一列都会分为男性和女性。但问题是,我们是不是把不存在的“一阶年份维度”做出来了?答案是使用FIX表达式:{fixed[customerID]:min([orderDate])}。3、每日盈利指标分析每年各月盈亏天数分布。如下图所示:该列是从年到月的下钻,更容易实现。只需拖入字段[year]并向下钻取到月度粒度,并删除季度粒度。行是“高收益”、“正收益”、“损失”的视角,值是当月的天数。那么如何计算高盈亏状态呢?因为最终的粒度是天,所以我们需要按天来统计。首先,我们需要得到每天的利润总和。这些中间过程可以使用LOD字段来完成,即创建一个每日利润字段(profitPerDay):{fixed[orderDate]:sum([profit])}。由于我们对利润总额不敏感,只想拆分成三个阶段,所以使用IFTHEN生成新的字段日利润指标(dailyProfitKPI):IF[profitPerDay]>2000THEN"HighlyProfitable"ELSEIF[profitPerDay]<=0THEN“无利可图”ELSE“有利可图”END。所以创建的[dailyProfitKPI]指标是一个维度,即如果当前行的每日利润汇总大于2000,则值为“HighlyProfitable”。所以将count(distinct[orderDate])拖到该行上,将[dailyProfitKPI]拖到该行的颜色透视图中。4.整体百分比LOD表达式的一大特点是计算跨细节层次的比例。比如我们要看欧洲国家在世界上的销量:显然这张图所有国家的总和不是100%,因为欧洲加起来才不到20%,但是以目前的详细程度来看,无法获得全球总销售额,所以我们可以使用FIX表达式来实现:sum([sales])/max({sum([sales])})。这里有两个解释:之所以使用max,是因为LOD表达式只是一个字段,并没有聚合的方法,必须在同一个细节层次上进行操作。由于总销售额只有一个数据,我们可以使用max或min甚至sum。结果是一样的。如果没有维度约束,则可以省略“fix”声明,因此{sum([sales])}实际上是一个FIX表达式,意思是{fixed:sum([sales])}。5.新客户增长趋势看着每年的客户增长趋势图,有没有想过这个趋势图一定是一直向上的?换句话说,看趋势图往上走并不一定说明生意做的很好。如果公司每年的发展都比去年好,那么每年新增客户的数量应该比去年多,那么年度新客户增长趋势图就更有意义了。如果看到这个趋势图的趋势是向上的,说明每年新增客户Customers比去年多,说明公司已经摆脱惯性,每年都有新的增长。所以我们需要添加一个过滤条件。新增一个维度字段,当这个单一客户是今年新客户时为真,否则为假,这样我们过滤的时候只看这个字段为真的结果。那么这个字段是怎么来的呢?这个想法是获取客户第一个订单的年份。如果第一个订单的年份与当前订单的年份相同,则该值为真,否则为假。我们使用LOD创建第一个订单年份字段[firstOrderDate]:{fixed[customerId]:min([orderDate])},然后创建一个筛选字段[newOrExist]:IFF([firstOrderDate]=[orderDate],'true','错误的')。6、销量对比分析如下图柱状图所示,右侧为各商品按所选品类的对比数据:对比值是当前所选品类减去当前销量。相信你也能猜到,但是上一个品类的销量与当前查看的详细程度无关,只与用户选择的品类有关。如果我们已经有一个度量字段——selectedcategorysalesselectedSales,则应该排除当前类别维度的干扰,所以EXCLUDE表达式可以用来描述selectedCategorySales:{exclude[category]??:sum([selectedSales])}。接下来是创建selectedSales字段。背景知识是[parameters].[category]可以得到当前选中的维度值,那么我们可以写一个IF表达式,聚合维度等于选中维度的销售额,不就是选中的销售额吗?所以公式是:IF[category]??=[parameters].[category]??THENsalesELSE0END。最后,要比较差异,只需使用表达式sum(sales)-sum(selectedCategorySales)创建一个[diff]字段。7.平均最大交易金额如下图所示。当前的明细级别是国家,但是我们要显示每个国家的平均最大交易额:显然,需要平均最大交易额,首先要计算每个销售代表的最大交易额,由于这个详细程度低于国家,我们可以使用INCLUDE表达式计算出销售代表的最大交易金额largestSalesByRep:{include[salesRep]:max([sales])},并对这个度量字段进行平均。从这个例子可以看出,如果我们是在更高的明细级别,比如country,此时的sum([sales])是按照country明细级别求和的,而忽略了销售代表的明细级别.但是如果要显示每个国家的平均最大交易金额,就必须在销售代表级别找到max([sales])。由于是针对每个国家,所以我们不使用{fixed[salesRep]},而是使用{include[salesRep]},这样最终计算的详细级别是:[country],[salesRep],这样最高的交易可以计算每个国家的销售额(因为有些销售额可能同时在不同的国家销售)。8.实际与目标在第六个例子-销售额比较分析中,我们可以看到销售额绝对值的比较。这一次,我们需要计算实际销售额与目标之间的百分比差异:如上图所示,左上角显示实际与目标之间的差异;右上角显示各区域产品目标完成率;下半部分为各产品实际销量柱状图,目标值用黑色横线标注。左上角很简单,[diffActualTraget]:[profit]-[targetProfit],目标利润减去当前利润即可。右上角需要分几步拆开。我们的最终目标是计算每个区域的产品目标完成率,显然公式是当前完成产品数/产品总数。产品总数比较简单。将已有的区域维度拆解后,计算产品总数即可,即count(distinct[product]);难点在于目前完成的产品数量。这里我们需要再次使用INCLUDE。为什么?因为区域粒度高于产品粒度,当我们看区域汇总时,我们并不知道每个产品的完成情况,所以我们必须包含产品维度来计算利润目标差异。公式为[diffProductActualTraget]:{include[product]:sum(diffActualTraget)},则当该值大于0时,则认为目标完成。我们可以再创建一个字段,即完成目标的数量。如果达到目标则为1,否则为0,方便求“当前完成产品数”:aboveTargetProductCount:IFF([diffProductActualTraget]>0,1,0),则当前完成数products为sum([diffProductActualTraget]),所以product目标完成率为sum([diffProductActualTraget])/count(distinct[product]),将此字段拖入指标,格式化为百分比,得到结果。总结通过上面的例子,我们可以总结出在实际业务场景中的几种使用方式:首先,将计算公式拆解,判断拆解后的字段是否在数据集中,如果是则结束。描述是一个简单的要求。如果数据集中没有,发现数据的详细程度与当前等级不匹配(比如要获取每个国家的销量,但当前维度是城市),则有必要使用FIXED表达式来固定详细程度。如果FIXED未在特定详细级别明确计算,则不要使用FIXED,因为它不是很灵活。如果您希望在计算时跳过指定的详细级别,但要在视图中保留该详细级别,请使用EXCLUDE表达式。如果计算涉及比视图更详细的级别,例如计算平均值或最大值和最小值,则使用INCLUDE表达式。也可以重新计算使用FIXED表达式创建的字段。对多个计算字段进行合理的拆解和组合,会让逻辑更加清晰易懂。讨论地址为:精读《15 大 LOD 表达式 - 上》·第369期·dt-fe/weekly想参与讨论的请戳这里,每周都有新话题,周末或周一发布。前端精读——帮你过滤靠谱的内容。关注前端精读微信公众号
