LOD | 在低层级上聚合高层级的聚合数据

举例,通过LOD找到每个州产品类别中具有最大品类的是什么

如下可以看到,加利福尼亚的Paper是最多的品类。

如下的例子,在不使用任何字符串操作的前提下,验证LOD的作用,在每个州中,找到最大的品类

Here’s the algorithm I use for this kind of calculation,这里我针对这种类似的案例使用这一类方式 I use this pattern pretty regularly这种模式也是比较通常的  becausemost of my work is done in MS Access  因为我的大部分工作是在MS的Access中完成的 where we don’t have more advanced features like partitioning and row numbering functions.Access中没有过多的高级特性,比如数据分区功能,计数功能

使用conutd()去取得每个品类和每个州的用户ID计数,是非重复计数,所以取得的是人数。

在Access中,是通过稍微复杂一点的方法,一系列聚合子查询(Access并没有类似count的函数)

但是呢,在tableau中就简单了,这就是LOD。重复一下,不仅仅是对用户计数,而是基于州的用户计数,和基于产品类别的计数。

对于类别和州这两类指标,取得每个州最大的。而这个是Access是一列操作,在tableau中是个LOD表达式。

在类别和州的层级上,将步骤1和步骤2的结果组合到一起。这个操作在Access中需要其他的辅助查询。tableau这是LOD表达的内置功能。

在Access中,写一个计算,判断两组数据是否匹配,然后再返回对应的类别信息。这在Access中使用IIF函数实现,同时在tableau中对应的是IIF or IF

然后返回这些结果,就可以得到最终的数据了。

但是,这仍然是复杂的,待我慢慢讲来。

如果你写的一个SQL的聚合计算查询,已经有充足的经验将大块的数据分解成更小的颗粒,直到每个小的颗粒可以在预定的层级做到单独的计算

And when working with SQL as part of that you’ve had practice in imagining what the query is doing prior to seeing the results, 

当使用SQL的一部分,你已经练习想象查询在看到结果之前,

你在工作的时候使用SQL作为一部分功能,同时想象着这个查询到底在做啥,

and (if you’re at all like me) have had tons of practice in figuring out where things went wrong when the granularity of the data vis-a-vis the GROUP BY fields, joins,

并且(如果你也是像我一样)有过许许多多经验in解决出错,在颗粒分组的时候。

and when calcs were performed made too many rows, too few rows, or just plain wrong results.

当计算进行了太多的行,过几行,或是错误的结果。

更甚,当计算执行后,有n多的行列,n多的报错,那么我想你是崩溃的

Where LOD expressions getbrain-twistingly complicatedfor people who haven’t had experience writing tons of SQL aggregate queries is that they haven’t had that practice in breaking things down, 

在LOD表达getbrain歪歪扭扭的complicatedfor人没有写SQL查询吨的经验是,他们没有打破的东西有实践,

LOD是给谁用的呢?LOD曲解难懂,给那些人,没有太对SQL聚合查询经验

*plus* in Tableau the aggregations that LOD expressions compute are only visible as results.

*加*画面LOD表达计算是唯一可见的结果聚合。

LOD的聚合计算只在结果是可见的,你不用关注过程。


创建并验证LOD,我所使用的LOD,为了使LOD的实现过程更清晰,我在每个step都做了对应的表达式,用以对比验证。


1 首先将想要使用的维度,拖入视图。此案例中,我希望使用的都是“州”这个字段

拖入视图,意思是将该维度放入到任何地方,行、列、页面、标记,都行的

但是筛选器不包括哦,因为筛选器并不能改变视图聚合的维度或颗粒。


2 拖入其他的字段,构建一个基本的视图(不含LOD的哦)

看图,拖入了“州”,以及custom ID的计数

3 对于每个LOD的表达式,指出对应需要的维度


注意:

FIXED,只能用于这种情况,就是LOD使用固定维度层级得字段,不会依据Viz视图情况而改变。

INCLUDE & EXCLUDE,可以用来加在任何维度的后面,也可以放在任何其他的嵌套表达式内层中。

关于筛选器的优先级

    筛选器也是优先级顺序的,(如下图)从上到下的顺序为:

FIXED>维度筛选器>INCLUDE/EXCLUDE

FIXED的表达式,是across all the data的,不用考虑筛选器的影响

所以,如果需要对FIXED表达式做筛选,就只能采用上下文筛选器(Context)


这工作会花费一些精力,不过为了做到精确的结果,这个绝对必要的。

就像我们经常做的任何事情一样,在实践中,这可以成为第二天性。

在mark'supdatehe的描述了Joe Mako的当前使用的技术,就是使用电子表格列出维度和度量,然后使用颜色区分INCLUDE和EXCLUDE的区别。

在这个例子中,唯一的附加维度是类别,所以维度是状态和类别。

4 使用对应的维度,开始一个LOD的视图


然后将LOD拖入到视图中,使用一种集合方式,比如SUM or AVG。

In the case of strings you can use MIN and MAX for validation. If each aggregation returns the exact same result, 

这个案例中,你可以使用min or max,如果每个聚合返回值都是同样的结果,那么很大可能你使用了正确的维度。

then you can be mostly sure that you’ve got the right dimensionality in the LOD workout view. 

I write “mostly” because there are dependencies on the granularity of the data that crop up as you get into nested LOD expressions as well as the main view.

我之所以说是“很大可能”,是因为要依据情况而定,要考虑到嵌套LOD在主视图的数据颗粒度,

这里写第一个表达式,返回了用户的非相同计数,基于“类别”和“州”

{INCLUDE [Category] : COUNTD([Customer ID])}

And here’s that calc in a view with State & Category as dimensions. We can see that COUNTD(Customer ID) is the same as the SUM, AVG, and MAX of our LOD calc:

如下就是两个维度,类别和州,作为维度的展示。可以看到,这种情形下countd和sum。avg,max是相同的

注意了,countd使用的就是普通聚合,其它三个使用的LOD(蓝色框)

6 重复3-5步,尝试不同的level

For example, if you are nesting LOD expressions at multiple levels of detail, that can mean putting the same calculation into multiple workout views to see what it’s returning. 

例如,如果你在多层次的情况下,使用嵌套LOD,这意味着可,使用同样的计算在多重工作场景去查看数据返回值。


In order to validate what INCLUDE & EXCLUDE LOD calcs are returning to the data prior to the aggregation at the vizLOD, you can highlight marks and use right-click->View Data->click on Underlying tab to see what they are returning (there’s an example of this below).

为了证实两者(INCLUDE和EXCLUDE)的在优先级上的区别,可以使用格式编辑,用以区分二者的区别,下边会有栗子

 Then you’ll also need to pay attention to how each LOD expression is aggregated in the different views.

在不同的view下,你还是要多多注意看,每个计算的结果。

In our case the only other granularity is that for the main view, the State, so we can skip this step.

我们的例子中,对于颗粒,我们只有两个,类别和州,1个是类别,另一个就是州,只有以后遇到超过两个类别的时候,再去特殊关注吧

7. Once you have the calcs working in the individual views, bring them one by one into the main workout view. Verify that they are returning the desired results.


一旦在单独的视图中开始使用计算,将给他们逐个的在主视图中显示,记得验证一下结果是不是你要的结果,这个很重要。

呐,如下即是,在同样的聚合条件下,主视图中countd,非重复计数

此图比前一个图,去掉了类别字段


复习一下看下图:紫色的是第二次引用的图,蓝色的是第一次引用的图

区别是紫色(第二次)去掉了“类别”

蓝色(第一次)保留了“类别”

紫色的15与,下图的15是对应的


Since the goal is to return the max COUNTD(Customer ID) for each Category, the MAX(CountD per Category) works.

因为目标是返回每个类别最大Max用户“非重复计数”

But we don’t want that to be returned as an aggregate in the view,

但是我们并不想看的是,返回一个聚合的数据

we want that as a record-level calc so a comparison can be made. The following Max CountD per Cat in State calc does that:

我们想知道的是对应级别的数据,这是做个对比是有意义的。下面的每个类别Max countd()就是做了这件事

呐,也就是上边蓝色图的15余紫色图的15啦

{INCLUDE : MAX([CountD per Category])}

公式如此

This uses a little trick in LOD calcs where by not including any specific dimensions we can force an aggregation at the level of detail of the viz (i.e. State) and still return that as a record-level result.

这里用了一个小技巧,不针对任何维度的计算,只写了INCLUDE,而后边不用跟具体维度,它是等效于INCLUDE 

额不知道怎么回答 

Here’s that calc in the workout view at different aggregations, showing it is returning the same result for each version:

Now for step 4 in the algorithm I laid out. Here’s the formula for the Largest Category (initial) calc:

这里,在增加一项目,如下是公式的细节(initial的)


IF [CountD per Category] == [Max CountD per Cat in State] THEN

[Category]

END)


意思是,如果 countd等于算出的Max值,那么久返回类别

否则就为空

估算一下结果,就是15那个,记得吧,只有最多的几项会显示对应的类别,其他的都为空

结果大概就是这个样子咯



继续


This calc takes advantage of a second trick with LOD calcs that I hadn’t known about until reviewing #8 in theTop 15 LOD Expressions

tableau官方有Top15个LOD应用,作者在读到第8个例子之前,还是对第二招的技巧不太知道

While we can use the results of a FIXED LOD expression in the view as a dimension or aggregated measure, in the view we can only use INCLUDE & EXCLUDE LOD expressions as aggregated measures. 

然而,当我使用了FIXED LOD的结果,再嵌套IN or EX的方式,可以完成很多事情

*However*, just like FIXED LOD expressions the results of INCLUDE & EXCLUDE expressions are returned at a record-level *and* can be evaluated at a record-level. 

尽管如此,

So the IF statement evaluation is only True when for a given record the CountD per Category for that record’s Category is also the maximum value in that record’s State, and the calc returns the Category for those records.

所以,IF的状态评价,是唯一的

而该计算返回这些类别的信息

Note that Tableau automatically applies the Count aggregation in the Data window, indicating that this calc has to be aggregated in some way in a view:

记住,tableau会在数据窗口中,自动的应用count的聚合

表明这个计算不得不被聚合以某种方式

看如下截图

Because we’re using a mix of calcs meant to work at different levels of detail here, validating this gets a little tricky. 

因为我们使用了混合的计算方式,意味着我们工作在不同的level,同时证实了这个方式是个不错的技巧。

We have to use the View Data->Underlying tab technique to see what’s going on, here I’ve selected Alabama:

现在,我们使用查看数据源,详细信息,来看看数据怎么变化的。如下是我选择了亚拉巴马州的数据。


可以看到那个IF的计算起作用了,如我所说,等于Max的,显示类别,不等于Max的显示null。

结果显示,Office Furnishings和Paper是最多的类别。

This is because there’s a tie with both having 15 distinct customers. If we wanted to show all the ties we’d run into a key difference between INCLUDE & EXCLUDE vs. 

这是因为有两个达成平局了,他们都是15个Max

于是,如果我想show出所有的平局竞争者,我应该去找到三者的关键区别FIXED,(FIXED,INCLUDE,EXCLUDE这三个家伙的区别)

namely that INCLUDE & EXCLUDE LOD expressions *have* to be aggregated in a view, and since the view is at the level of detail of State that meants the aggregations of MIN(), MAX(), etc. all only return a single result, not every result. 



So there’s no way to use the INCLUDE & EXCLUDE to show the ties, I’ve got a follow-up post in the works that describes how an alternative calc using FIXED can show all the ties.

所以使用IN or EX 是没办法显示tie在哪里,我后边做了一个表,描述了,备选的计算方式使用FIXED可以显示所有的tie


To resolve that tie for now, we’ll use the MIN() aggregation:


为了解决tie的问题,来试试min()的效果

看图,在Row,“州”字段的右侧有拖入一个min

To build the Largest Category (final) calc I chose to apply that aggregation in the calc (that way Tableau won’t be adding anything to the column name in the view) and we’ll add in the CountD per Category as part of as string to show that as well, so it will look like “Office Furnishings (15)” for Alabama. Here’s the formula:

下一步,创建final版本的Max类别计算字段,我选择了在计算中应用聚合,(tableau在这个计算中并不会加入任何列名)并且我会添加countd计算,在每个类别中,作为xxx的部分,所以就是很像Office Furnishings (15)” for Alabama,如下是公式:

就是在IF的外层,嵌套了min()

在类别的右侧加了个括号

括号内部写的是实际的count值

MIN(IF [CountD per Category] == [Max CountD per Cat in State] THEN

[Category] + ' (' + STR([CountD per Category]) + ')'

END)


Here’s the calc when looking at the Underlying Data:

在源数据中的样子


And in the view

在视图中的样子

Building the final worksheet is a matter of dragging and dropping pills to remove the unneeded measures and generate the final chart:

基于上边的工作,可以着手创建最终的视图了,简单说,就是拖入有用字段,移除无用字段。

Why stop here, though? One key feature of using INCLUDE & EXCLUDE LOD expressions is that the results are dependent on the dimensions in the view. 

那么,为什么停在这里?

一个主要的区别,它们三者,就是,视图中的结果会依据属兔中的字段维度的不同,而不同的。

We can take advantage of that (and all the work we’ve done) and simply drag & drop dimensions. Here’s a one-click change to finding the largest category for each Container:

我们可以利用这个已经完成了测试视图,做一些简单的拖拉维度,即可完成最终视图。

如下,是一个最终构图的字段截图,可以参考。


And we can have multiple dimensions, here I’ve added the YEAR(Order Date) to the view with one more click:

那么,我们有多个维度,我又添加了“年”到视图中

For those readers who have experience using Tableau table calculations, this last bit is incredibly awesome. 

对于读者,那些有经验的读者,使用过tableau的读者,这最后一点是难以置信的nb

We could have built any of these views with table calculations, but switching out dimensions would likely break things so every new view would have to be hand-crafted and revalidated, 

我们可以制造任何这些表计算,但开关的尺寸可能会打破的东西,所以每一个新的视图必须手工重新验证,

whereas with LOD expressions we can be back in the flow of dragging & dropping pills to ask more questions of our data.

而,有了LOD的帮助,,我们可以再次回到思维流的状态了,更多的关注数据的故事,而不是技术。

总结


 how to work with LOD expressions in a stepwise fashion so you can validate each step of the way, and demonstrated a couple of lesser-known aspects of LOD expressions: using INCLUDE or EXCLUDE without a dimension, using results of INCLUDE or EXCLUDE to do record-level evaluations, and finally how easy it can be (once you’ve done the heavy lifting) to rearrange views using LOD expressions. I hope it’s useful for you, if you have any comments, questions, or other tips, please comment below!


这篇文章描述了另一种算法,使用LOD表达式,从一个较低的水平返回一个维度(细粒度)到一个更高的粒度

如何在逐步时尚LOD表达工作这样你就可以验证每一步的方式,并展示了几个鲜为人知的方面:使用LOD表达包括或排除不一个维度,使用结果包括或排除做记录水平的评估,最后怎么可以轻易(一旦你完成繁重)重新采用LOD表达意见。我希望这对你有用,如果你有任何意见,问题或其他提示,请在下面评论!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容