Cube
Fact Table
- table name
- fact table filter
Fact
- fact name
- calculation
- fact filter
Dimension
- dimension name
- dimension table
- key
- foreign key
- join type
- dimension filter
Level
- level name
- level label
- level key
- level order
OlapReporter#report函数
- cube
- facts string
- levels string
- runtime filter
Example
Order Table
id | price | cost | customer_id | sale_date | status |
---|---|---|---|---|---|
1 | 1520 | 1023 | 93 | 2017-05-03 | 6 |
2 | 2785 | 1972 | 1172 | 2017-05-03 | 6 |
3 | 582 | 179 | 11237 | 2017-05-03 | 8 |
Customer Table
id | customer_name | is_internal | city | province | country |
---|---|---|---|---|---|
1 | 张三 | T | 杭州 | 浙江 | 中国 |
2 | 李四 | F | 上海 | 上海 | 中国 |
3 | 王五 | F | 洛杉矶 | 加利福尼亚 | 美国 |
Date Table
date | day | month | year |
---|---|---|---|
2015-01-01 | 1 | 1 | 2015 |
2015-01-02 | 2 | 1 | 2015 |
2015-01-03 | 3 | 1 | 2015 |
Fact
语法
avg|sum|count|max|min(fact_field)
说明
Fact的计算,要求只做一次统计预算,fact_field
是已有的字段。不允许在统计操作符里再做额外的计算。例如sum(case when enter_type = 1 then 1 then 0 end)
是不允许的。这就要求有计算字段(computed field),而且已经提前计算好。计算字段的方式可以有两种方式实现:
- ETL
- 数据库里的视图(View)
视图方案更轻量,优先考虑。
Dimension
例子
{ "dimension_name": "sa", "table": "employee_buser", "key": "id", "foreign_key": "sa_id", "levels": [{ "name": "sa_level", "label": "b_user_name", "key": "id", "order": 1 }, { "name": "section_level", "label": "section_name", "key": "section_id", "order": 2 }] }
说明
dimension因为包含levels,比较复杂,所以采用json的格式。注意:除了foreign_key是fact
的字段,其他的都是dimension
的字段
Filter
语法
dimension_name:level_name operator value AND|OR ...
或者
fact_field operator value AND|OR
例子
sa:sa_level in (35,47,56)
created_time_dimension:month = '2017-04'
order_status != (8)
说明
operator
支持以下操作符
- =
- >=
- <
- <=
- !=
- in
- not in
- is null
- is not null
注意 在实现dimension的filter时,和value
比较的是level_key,而非level_label