sql构建逻辑
2021-10-21 17:13:47 0 举报
AI智能生成
sql构建逻辑
作者其他创作
大纲/内容
元数据解析
解析查询的指标、维度,以及全局过滤信息,收集每个事件涉及到的维度、指标
合并同一事实表的所有事件,收集每个事实表涉及到的事件、维度、指标
事实表VO
将指标分组,对于预计算指标和普通指标,都是一层就能计算完成的,按使用的事实表分组,对于二次聚合指标,需要两层聚合,无法与别的指标一起计算,则每个二次聚合指标一个单独的分组
针对单一事实表VO构建SQL
构建InnerWithVO
构建FROM SQL
解析事实表VO中的所有维度信息,收集需要关联的维表信息成FromConditionDto
根据关联表信息FromConditionDto构建InnerWithVO的FromSql部分,从事实表和维表中select * 后根据配置的关联关系join起来
构建SELECT SQL
获取每个事件的可分析维度集合,合并成事实表的可分析维度集合
根据统一维度获取每个使用到的维度的可关联事实表维度集合,判断维度的可关联事实表维度集合与事实表的可分析维度集合是否有交集,有交集则使用交集的维度,否则报错
如果交集只有一个,直接select nvl(列表达式, 'OTHER') as 列名(如果是衍生维度,则使用衍生维度构建出来的表达式),并将维度id和列名对应字典关系存起来
针对交集有多个情况,使用case when 针对每个事件使用不同的维度(如果有衍生维度则会嵌套case when,不过这是合法的),然后重命名为统一维度的名字,然后把维度id和列名对应字典关系存起来
构建WHERE SQL
根据事实表使用到的事件,将事件id条件构建成WHERE语句,如果是衍生事件,则使用衍生事件的条件表达式
根据InnerWithVO构建OuterWithVo
普通指标 || 预计算指标
构建GROUP BY SQL
根据cube选择的分析维度,从InnerWithVo的维度字典中获取对应的列名group by,根据条件选择是否with cube
如果是预计算指标,不group by
构建SELECT SQL
cube选择的分析维度
cube选择的指标, count(if(指标中配置的业务限定 AND 指标的事件id限制, (指标聚合的维度), null)) as 指标列名
构建WHERE SQL
根据全局限定构建条件语句
如果是预计算指标,加上全局限定的条件,还要将所有没有选择和限定的维度列都加上='ALL'的条件
构建FROM SQL
from InnerWithVo.Sql
二次聚合指标
构建SELECT SQL
构建FROM SQL
走普通指标 || 预计算指标的逻辑
构建GROUP SQL
根据配置的聚合维度从InnerWithVo的维度字典中获取维度聚合
针对多事实表VO构建SQL
针对每个事实表VO,走单一事实表的逻辑构建以一个或多个OuterWithVO
构建FROM SQL,里层将所有with查询结果unionAll起来
里层FROM
将所有OuterWithVo的结果UNION ALL起来
里层SELECT
cube选择的分析维度
对于这个OuterWithVO有的指标,从指标字典中获取列,对于没有的指标,使用NULL as 列名的方式补齐
构建SELECT SQL
cube选择的分析维度
对于每个指标,使用MAX的方式取值
构建GROUP BY SQL
根据cube选择的分析维度集合,从每个OuterWithVO中获取维度对应的列
0 条评论
下一页