假表层函数

阅读(84) 标签: 假表, 层函数,

在表中,参数为维的函数,且返回维与原维不同时,称为层函数

所谓假表,就是虚表中实际不存在的单字段表。在DQL中引入假表的概念,主要是为了解决两类问题

第一类通过定义维的各个层次结构,使用户能够在不同的粒度上观察数据。

通过假表与层函数的配合使用,我们能够定义类似于,年、年月、日期,这样的日期层次,从而使用户获得能够在不同时间粒度上观察数据的能力,同样的,我们也能够定义国家、省、市这样的结构,这取决于具体的业务规范,对于这种结构,在元数据编辑设计器中都可以一次定义,到处使用。

对于层次结构的定义,通常有几个维度就定义几张表(或假表)。比如上述的日期,一般就定义年、年月、日这样三张表。如果业务表中的日期字段存储的是日信息,就让它指向表,如果是年月信息,则指向年月表,依次类推。

在元数据定义中,当表间的外键关系设定之后,会根据外键设定中,产生的维信息,自动生成维的相关定义。然后可以在元数据的维和层页面里,定义这几个维度间的计算关系。

 

举例:

日期维中定义层函数,比如demo.glmd中通过DayYearYearMonth三张假表定义的日期层次:

 

 

 

说明:

1) 在层间计算式中用?表示源字段表

,表示Year维年字段的值可以由YearMonth维的年月字段通过表达式int(?/100)换算而来。

2) 层间计算式也可以说成从细向粗计算。比如“Day”维,只能从日算出年,不能从年算出日。

3) 目标维可分别通过多个源维进行换算。比如“Year”维,可能是从日聚集到年,也可能从年月聚集到年,因此,对于“Year”维,就要定义两个层间计算式,分别从“Day”表的日期和“YearMonth”表的年月计算而来。

4) 定义好这种结构之后,我们就可以在DQL中直接使用定义中的任何结构,如下例:

 

ReturnedPmt表中Date是个日期类型,在ReturnedPmt表的外键定义中,我们将ReturnedPmt表的字段DateDay表的字段Day建立外键关系,如下图:

这样,我们就可以在DQL中获得Date的年,月等信息了,如Date#Year,得到Date的年份,Date#YearMonth就得到了Date的年月

DQL: SELECT CustomerID,ID,Date,Date#YearMonth YearMonth,Date#Year Year,Amount,SellerID FROM ReturnedPmt

DQL: SELECT sum(Amount) Sum_Amount ON Year FROM ReturnedPmt by Date#Year

DQL: SELECT sum(Amount) Sum_Amount ON YearMonth FROM ReturnedPmt by Date#YearMonth

举例:

整数维中定义层函数,比如demo.glmd中通过ProvinceAreaCity表定义的层次:

DQL查询语句及结果:

DQL: SELECT CustID,CustName,Contact,ContactTitle,CityCode,CityCode#Province Province,CityCode#Area Area FROM Customer

DQL: SELECT count(CustID) CustNumber ON Area FROM Customer BY  CityCode#Area

DQL: SELECT count(CustID) CustNumber ON Province FROM Customer BY  CityCode#Province

第二类可以充当数据库视图,这种情况下,可以把假表视为表来使用,可以为其定义主键、外键等属性,在用户眼中和表是相同的。

知识点:

有了假表和层函数等概念,用户就可以按照希望的层次来观察数据,并且用户也可以更灵活的使用数据。