Calculation View里的Keep Flag 和 Transparent Filter

本文详细介绍了数据仓库中Calculation View(CV)的概念及其取代AttributeView和AnalyticView的原因,重点讨论了Cube与AggregationNode在数据聚集中的作用。CV中的Dimension对应infoobject,而Cube则对应fact表。在建立带有Aggregation的Cube时,系统会自动进行GROUP BY操作,并要求至少有一个值字段。KeepFlag用于指定非GROUP BY字段参与聚集,而TransparentFilter则确保某些字段仅作为过滤条件而不参与聚集。这两个概念在解决复杂查询场景中起到关键作用,例如处理条件判断列和多层级的聚合需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这俩货是手拉手的。那它俩到底是干啥来的?

我们建一个CV,默认cube不选star join的话,节点就是个aggregation node。

因为这个CV现在取代了以前的Attribute View,Analytic View。 以前这俩分别对应infoobject和ADSO。为啥被取代?因为说这几个view执行的引擎不一样,如果你最后calculation view里用了上面两个,那么来回在不同引擎里面交互,怪费时间的。

现在CV里面的dimension对应infoobject。空的 对应只能在其他view里面用,不能被query用上。

Cube对应fact表,Cube with star join对应fact表和一圈dimension表。

当我们去建一个cube,默认是aggregation的话,那也就是说这个fact表里面的值字段会被聚集。而且aggregation要求你必须有一个值字段。

这个aggregation工作细节是啥?

值的聚集可以是基于好多个属性的。聚集的意思就是GROUP BY后计算。每一个值,你都得给安排个group by。因为你去query的时候,选一些属性,query会自动给你做group by。

一般建的CV支持的聚集如下:对于方差啥的,我还没有用过。默认是sum。还有一个AVG没截出来。standard deviation标准偏差我也不知道是啥。

 聚集节点里,如果有calculated column,那会在聚集功能之后被计算。

你要想先计算,那就得在aggregation节点之前搞个projection去计算。一般咱也都是在projection里面去计算calculated column.

反正就是说,如果你在aggregation节点里,把一个属性列加到output里面了,系统就知道你要用这个列做group by。或者你直接把这个列加成被聚集列,那它也能被聚集。比如你建的calculated column,就可以自己加成被聚集列。

最后咋看?

在这个SQL里面,看到你的group by:

这个GROUP BY是在你的aggregation 那边定义好的。这个会直接覆盖你在semantics里面弄的。

 

 等搞完这一切,去query的时候,具体数据是怎么被聚集的,得要仔细看看了。因为有些复杂的情况,比如你有个判断列,销售金额大于100,就给值1,小于100,给值0. 这种列,给你最后result row聚集的时候,会基于所有销售金额的值来直接给个1.这种可能不满足需求了。

对于这些复杂的情况,就需要下面两位小兄弟登场了:

Keep Flag

看下面这个例子,我需要得出在2月的卖出的鼠标的个数。

我去基于这个表建CV并且预览数据的时候,应该给我40。

 但是实际上没有,实际上最后的结果会是 160. 为啥呢?

 去看log里面的SQL语句:

select "Month", "Product", sum("Quantity"), sum("Price")
from "DEMO"."demo.modeling.db::cds.storeorders"
where ("Month" = '2' and "Product" = "Mouse" )
group by "Month", "Product"

 默认是两个group by的字段,月和产品。这样计算的时候就会直接把月度和产品上的数量和金额总和聚集了之后再相乘。这数据明显就错了。

我其实需要的是更细粒度的,我要在每一个订单上先计算出总金额,然后再sum起来。那我就得给这个order ID一个keep flag: true.这个keep flag就是说,我虽然不是个group by的字段,但是我要求你在我这个level上计算聚集。

 Transparent Filter

这个跟filter是啥关系?filter也就是个where条件。那这个transparent filter是啥意思?

总结起来就是:我只需要这个属性来做filter筛选,不需要在聚集里被当做分的组。

在SQL语句里,group by 后面的字段必然会出现在select里面。where后面的字段,也是会被考虑在聚集里的

看下面这个例子:要计算卖鼠标给John和Susan的店铺的总数。店铺总数是两个。

但是实际计算的时候,会默认把客户也给当成一个分组的维度了。

也就是说,where后面的这个customer被分了组。

select product, sum(quantity), sum(storecount) from model
where Customer in(john, susan) and product = mouse
group by product

那怎么办?就要在customer上设置transparent filter为TRUE。意思就是说 别把我放到分组的里头考虑,我就只是来做过滤的。

 总结以上两个。

Keep flag就是说:要把我考虑进group by。

Transparent filter就是说:把我当做个只做过滤的小透明,别把我考虑进group by。(这个适用以上计算个数的场景)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomici

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值