环境:BIEE 11.1.1.7...
背景:
经常有人会有疑惑,不知道BIEE中的时间序列函数的作用机理,其实跟踪其生成的SQL后,就会发现和我们自己写的类似逻辑的SQL是一致的。
举个栗子:求对于2015.10月份的去年的同期销售额。
假设时间维为日月年层级,时间维和事实表关联为日层级。那么写的SQL伪代码类似如下:
select d.year_month,sum(f.xxx)
from fact_a f,(select a.year_month,b.date_id from time_d a,time_d b where a.year=b.year+1) d
where f.time_id=d.date_Id
group by d.year_month
- 对于SQL来说就是用辅助表换算出对应关系,然后用辅助表的时间去关联事实表,然后用展示的时间去统计汇总。
- 对于BIEE来说就是用AGO(销售额,时间维年层级,1) ;其实BIEE也是生成了类似的语句,不过是用CTE来完成的。先生成对应的层级和关联层级的基础表,然后根据层级建立中间关系表,然后事实表和中间关系表和基础表做连接取得结果集。
举第2个栗子:求对于2015.10月的按年累计销售。例如我拖2015.10出来即展示2015.01~2015.10的销售数据。
select d.year_month,sum(f.xxx)
from fact_a f,(select a.year_month,b.date_id from time_d a,time_d b where a.year=b.year and a.month>=b.month) d
where f.time_id=d.date_Id
group by d.year_month
- 对于BIEE来说就是用TODATE(销售额,时间维年层级) ;其实BIEE也是生成了类似的语句,不过是用CTE来完成的。先生成对应的层级和关联层级的基础表,然后根据层级建立中间关系表,然后事实表和中间关系表和基础表做连接取得结果集。
那么AGO和TODATE嵌套呢?还是一样的。CTE生成基础表,根据基础表生成对应关系表,然后事实表、关系表、基础表做关联出数据。
那么AGO嵌套TODATE和TODATE嵌套AGO是一样的么?
例如AGO(TODATE(销售额,年),年,1)和TODATE(AGO(销售额,年,1),年)
想一想他们的逻辑,结果应该是一致的。
2015.10 AGO(TODATE(销售额,年),年,1)
先关联出年和月2015.10对应2015.01~2015.10,2014.10对应2014.01~2014.10,然后关系表AGO一年,就是让2015.10对应2014.10对应的2014.01~2014.10.然后和事实表关联出数据。
2015.10 TODATE(AGO(销售额,年,1),年)
先关联出年和月2015.10,2014.10,然后关系表AGO一年的关系表2015.10对应2014.10,然后TODATE逻辑2014.10对应2014.01~2014.10,那么最终的关系表和事实表关联出数据。
其它函数大体也类似,理解了其原理,就再不会有疑惑到底该怎么写公式了。