LOD表达式在数据分析领域是非常常用的,它的全称是LevelOfDetail,即细节层次。精读什么是细节级别以及为什么需要LOD?你一定有这个疑问,让我们一步一步来解答。详细程度如何?你可以试着问这个问题:你的数据有多详细?我得到的答案可能是:数据是汇总的,抱歉我看不到细节,但如果你恰好想看总销售额,这里有一个总结给你。.详细的?这直接是原始表数据,30亿,够详细了吧?如果觉得不够细化,那就得把业务流程拆分出来,重新埋起来。详细程度越高,数据量越大,详细程度越低,数据越少,聚合数据越多。人们很难在这30亿条记录中看到非常详细的有价值的信息,所以数据分析的过程也可以看作是对数据进行汇总和计算的过程,其背后是数据的详细程度。逐渐减少。BI工具的详细程度如果没有LOD表达式,BI查询的详细程度是完全固定的:如果将表拖入度量,则没有维度,是最高的详细程度,因为只有最后总结一个记录。如果将折线图拖入某个维度,则结果是根据这个维度聚合指标,数据更详细。详细粒度是当前维度,比如日期。如果我们想要更详细的数据,我们需要在维度上拖入更多的字段,直到我们达到最详细的计划级别粒度。但是同一个查询不能包含不同的详细粒度,因为详细粒度是由维度组合决定的,不能改变,比如下表的例子:行:国家、省、市,列:GDP在这个例子中,详细级别仅限于城市级别的汇总,城市下更细粒度的数据将不可见。每一条数据都是城市层面的。我们不可能在查询结果中看到按国家汇总的GDP,也看不到更详细的月度GDP信息,更不可能将市级GDP和国家级GDP一起算出比例该市的GDP占全国的比重。但是像上面例子这样的需求有很多,而且很常见。BI工具必须想出一个解决方案,于是LOD诞生了:LOD是一种表达式,可以让我们在查询中描述不同的详细粒度。从表达式计算的角度来看,表达式计算的细节层次必须限制在相同的细节粒度。这是铁律。为什么?想象一下下面两个不同详细粒度的表:总销售额:10000每个城市的销售额:北京3000上海7000如果我们要计算每个城市销售额中的贡献比例,那么我们要写[每个城市的销售额]/【总销售额】,但是显然这是不可能的,因为前者有两个数据,后者只有一个数据,根本无法计算。我们能做的一定是相同行数的数据,所以无论是IFELSE、CASEWHEN,还是加减乘除,都可以按照行粒度来做。LOD使我们能够跨详细粒度进行计算。它的本质是统一数据的细化粒度,但是我们可以让某一列数据来自完全不同的细化计算层次:citysalestotalsales北京300010000上海700010000比如在图表中,LOD可以处理数据,这样虽然总销售额和城市的详细粒度不同,但还是加到每一行的末尾,这样就可以计算了。因此,可以在任何详细级别计算LOD,使最终输出“适合”当前查询的详细级别。LOD表达式分为三种能力,分别是FIXED、INCLUDE、EXCLUDE。FIXED{fixed[province]:sum([GDP])}根据固定的城市详细粒度计算各省的DGP,最后合并到当前详细粒度。如果当前查询粒度是province和city,那么LOD字段的添加逻辑如下图所示:可以看出本质是两个不同的SQL查询后join的结果。internalsum表示FIXED表达式中的聚合方式,externalsum表示如果FIXED详细级别低于当前视图的详细级别,如何聚合。本例中FIXED的详细程度更高,所以sum不起作用,改成avg的效果是一样的,因为合并的详细程度是一对多的关系,只有很多合并时需要聚合一对一关系。最外层的聚合方法通常在INCLUDE表达式中发挥作用。EXCLUDE{exclude[city]:sum([GDP])}在当前查询粒度中,剔除城市粒度后计算GDP,最后合并到当前详细粒度中。如果当前查询粒度为省、市、季,那么LOD字段的添加逻辑如下图所示:详细程度肯定会更高。INCLUDE{include[urbanandrural]:avg([GDP])}在当前查询粒度中,加上城乡粒度计算GDP,最后合并到当前详细粒度中。这样的例子很难理解,一般在sum的情况下没有实际意义,因为计算结果不会不同,在类似avg的场景下肯定有意义。我们看下图:这就是avg的不准确问题是在不同的细节层次上计算出的平均值是不一样的,但是sum、count等不会随着细节层次的变化而影响计算结果,所以当涉及到avg计算时,可以通过INCLUDE表达式指定计算的详细程度,保证数据口径的准确性。LOD字段的使用方法除了上面例子直接勾出显示给用户外,LOD字段更常用作中间计算过程,比如计算一个省份的GDP占全国的比重。因为LOD已经将不同详细粒度的计算结果合并到了当前的详细粒度中,所以下面的计算表达式:sum([GDP])/sum({fixed[country]:sum([GDP])})看起来是Infact,没有交叉详细粒度计算。实际计算还是逐行计算。后续的LOD表达式只是按照指定的详细粒度进行逻辑计算,但最终会与当前视图的详细粒度保持一致,因此可以参与计算。后面我们会继续解读tableau整理的Top15LOD表情业务场景,对LOD表情有更深入的了解。摘要LOD表达式使您可以轻松地创建“超出”当前视图详细级别的计算字段。您可能想知道,为什么不主动更改当前视图的详细级别来达到相同的效果呢?例如添加或减去维度。原因是LOD经常被用于跨细节层次的计算,比如计算部分占整体的比例,计算当前记录是否为用户的第一笔订单等,更多场景会在接下来的精读中解读。讨论地址为:Jingdu《什么是 LOD 表达式》·Issue#365·dt-fe/weekly想参与讨论的请戳这里,每周都有新话题,周末或周一发布。前端精读——帮你过滤靠谱的内容。关注前端精读微信公众号
