这俩货是手拉手的。那它俩到底是干啥来的?
我们建一个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。(这个适用以上计算个数的场景)