复杂分析场景,SQL or MDX ?

提起 SQL,相信从事过数据分析相关工作的同学,对此都不陌生。在零售、银行、物流等行业,业务往往会有复杂的分析需求,如半累加,多对多,时间窗口分析等,SQL 在处理这些场景时,就有些捉襟见肘了。那有什么方案能够轻松应对呢 ?  答案就是: MDX

本文将从基本概念、BI 语义模型和分析场景来介绍 MDX 与 SQL 的区别。看完之后,相信您会更加了解为什么 MDX 比 SQL 加适合复杂分析场景。 

MDX 和 SQL 基本概念

MDX (Multidimension eXpressions) 是一种 OLAP 多维数据集的查询语言,最初由 Microsoft 于 1997 年作为 OLEDB for OLAP 规范引入,随后集成在 SSAS 中。目前,在 OLAP 数据库中被广泛采用。 

MDX 查询语法示例如下: 

select<Axis Expr>[,<Axis Expr>]from[cube]where<set>

SQL (Structured Query Language) 是一种用于管理关系型数据库的编程语言,包含 DQL(查询)、DML(增删改)、DDL(定义修改元数据) 和 DCL(权限、事务控制)。为了方便阐述和 MDX 的区别,本文只涉及 SQL 的查询部分。

SQL 查询语法示例如下: 

select<columnexpr>[,<columnexpr>]from[table]where<expr>

MDX 和 SQL 查询的主要区别:

a. MDX 选择的主体,即 select 部分,是维度度量或其表达式。SQL 选择的主体是列或列的表达式。

b. MDX 查询的主体,即 from 部分,是多维数据集(Cube),是提前 join 和聚合好的数据,查询时不需要指定 join 关系。SQL 查询的主体是关系表(table),是一条条的明细记录,查询时需要指定表之间的 join 关系。

MDX 与 SQL 的联系:

MDX 在很多情况下是可以等同于 SQL 的,比如需要查询 2019年所有省份的电子产品的销售额。

用 MDX 表示为: 

select[Region].[Province].membersfrom[Sales]where([Time].[Year].[2019],[Product].[Category].[Electronic Prodcut])

用 SQL 表示为: 

select region.province from sales 

join region on sales.region_id = region.id 

join time on sales.time_id = time.id

join product on sales.product_id = product.id

where time.year = 2019 and product.category = "Electronic Prodcut"

BI 语义模型

当前,主流的 BI 产品(Tableau, Power BI,Qlik等)都支持通过 SQL 接口(JDBC/ODBC)连接关系数据库,也支持 MDX 接口(XMLA)连接多维数据库。但 BI 通过两种接口获取到的语义模型有较大的差异,下面将具体介绍。 

MDX 语义模型包含维度(维度别名),度量(度量别名),层级结构等,无需分析师在 BI 端再对模型进行业务语义的定义,这样的好处是 建模师可以在OLAP工具中统一定义业务用户分析时使用的语义模型,而业务在使用 BI 工具分析时无需理解底层表结构,直接使用同步到 BI 工具的维度、度量、层级结构、计算度量等进行分析。 

另外 MDX 对复杂分析场景的控制能力比 SQL 更强,对于一些复杂场景如半累加、时间窗口分析、多对多关系等,MDX 都可以通过简单的表达式来处理。而同样的逻辑使用 SQL 就需要使用非常复杂的查询才能实现,有些场景甚至无法简单通过 BI 发送的 SQL 查询来实现。

SQL 语义模型 

 仅包含源表和源列,需要分析师 /业务用户手动定义表的模型关联关系,维度的友好名称,度量的友好名称及聚合类型,层级结构的源列顺序等。这些完成后才能进行正常的业务分析,这样的好处是终端用户可针对分析需求灵活的进行数据建模,但同时也要求用户对底层数据结构有一定的理解理解。 

MDX实现的复杂分析场景

库存分析,是制造、零售和物流行业等经常遇到的分析场景。其中,库存量是一个半累加度量,即在时间维度上不具备累加性,但是在其他维度具备累加性。

假设,库存的记录如下,需要获取每月所有产品期初(月的第一天)和期末(月的最后一天)的库存总量。 

我们按照分析需求,得到的结果应该如下:

如果使用 SQL,查询表达式如下:

select`year`,`month`,sum(casewhen`dayofmonth`=1theninventoryelse0end)as"Inventory on first day of the month",sum(casewhenday(last_day(`year`||'-'||`month`||'-'||`dayofmonth`)=`dayofmonth`theninventoryelse0end)as"Inventory on last day of the month"frominventorygroupby`year`,`month`

如果使用 MDX,需要先定义计算度量(包含的基础度量 [Measuers].[库存]=sum(inventory)),如下: 

[Measures].[期初库存] = ([Time].[Month].currentMember.firstChild, [Measures].[库存]) 

[Measures].[期末库存] = ([Time].[Month].currentMember.lastChild, [Measures].[库存]) 

MDX 查询表达式为:

select{[Measures].[期初库存],[Measures].[期末库存]}onColumns,[Time].[Month].membersonRowsfrom[inventory]

由上可见,在库存分析场景中,MDX 比 SQL 更容易实现。类似的场景还有银行业常见的账户余额分析,证券行业常见的期初期末值分析等。另外,MDX 还能够支持对多分析场景,这是 SQL 所不支持的。 

Kyligence MDX: 支撑企业部署统一的 BI 语义层

Kyligence 提供的 AI 增强型大数据平台同时为 BI 用户提供了 SQL 以及 MDX 标准接口,可无缝集成市面主流 BI,提供统一的基于大数据的业务语义层,MDX 的接口。

为企业实现企业级业务语义层提供了技术可能性,并可满足更多 SQL 很难满足的复杂分析场景。 

总结

MDX 和 SQL 都是在 OLAP 查询中经常使用的语言,主流的 BI 厂商都提供对两种接口的支持。两者的差异在于:

第一点,MDX 查询对应的是多维视图,而 SQL 对应的是关系视图,在聚合查询的语法上 MDX 要简单许多。

第二点,MDX 接口暴露的语义模型更加丰富和业务友好,而 SQL 接口暴露的语义模型相对简陋,需要后续再定义。

第三点,MDX 计算表达能力更加丰富,能够更好的支持复杂分析场景。 

总的来说,如果业务上有复杂的分析场景需求(银行、零售、物流等传统行业经常遇见)如半累加,多对多,时间窗口分析等,有统一的BI语义层需求时,Kyligence MDX 方案能够帮您轻松处理,从而更好的专注与业务数据的分析。 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容