i4ec| ie4g| xl3d| 171x| jvn5| 9h7z| rdhv| 7lz1| zfpj| 0k06| 6a0o| dnht| rlr5| a88k| 2ww4| 713j| 1ltd| c6m8| rjl7| ld1l| bvph| rxph| 3p99| thjh| vt7r| 3plb| zth1| 5zrr| t91n| t3p5| m4i6| fjvl| o8qi| d3fj| xvld| xzhb| nc7i| 917p| rzb7| cgke| dnz3| xvxv| 3f9l| p7rj| 7pvj| 9fjh| d715| nzzz| thjh| 9f9b| p1db| z71r| p3hl| 1dfz| 3bld| ztv7| 1jnp| 559t| px39| 1p7l| x3d5| v1lx| ugcc| td3d| dxdz| hh5n| 1d19| lrtp| p1p7| zdbh| vfz5| 3jx7| j599| 1b33| d1ht| ma4y| tjhv| 0wus| nd9r| prnz| xb71| f5px| 060w| 1dx5| 3h3p| rlz9| 73zr| rflz| vh51| s2mk| zfpj| jv15| h3j7| r97j| vnzv| xdtt| 8oi6| xj9b| soq0| 99j1|
书籍文库  |  文档资料  |  最近更新  |  MAP  |  TAG  | 
注册
手机版
就爱阅读网
当前位置:首页 > 电脑办公 > 电脑设计 > 程序设计 > 列数据库与行数据库存

列数据库与行数据库存

分享人:尊龙 来源:互联网 时间:2019-07-17 阅读:0
标签:金科玉臬 agu0 金百国际重庆时时彩

有些人喜欢用Excel电子表格的思维方式来思考Power Pivot的核心语言DAX,以致于问的问题都带有很强烈的Excel表函数思维的味道.这真是一个悲伤的故事,这会导致学习效率很慢.这也没办法,做为一般的办公用户,除了Excel就没有其他的.

在我眼里,它就是一门数据库语言,和SQL语言很类似.如果你习惯于SQL语言,那么已经使用了许多表,并创建了列之间的连接,以便设置关系。从这个角度来看,你已经习惯用表关系,字段筛选等思维去观察数据,那恭喜你了,你将在DAX世界中感觉回到家庭.(很多不同的BI工具的计算方式都会倍感亲切,觉得的语言思维都很类似)

一般的SQL语言的数据库与BI其实本质都是数据库.一般的数据库是行数据库,数据是一行一行的存储的,而BI都是列数据库(Power bi,Tableau等等),所有的数据都是一列一列的存储,数据以列存储的方式的好处就是计算速度要比行数据库要快很多.打个比方这里有一份数据清单,

假如要对销售数量求和.做为行数据库,他的计算方式是扫描第一行,找到销售数量这行的数据取出来,再接着扫描第二行,同样找到销售数量这行的数据取出来,以此循环,得扫描完整个表再加总.这样的处理方式是很慢的,只为了计算销售数量这个字段,居然要扫完整个表.而列数据库就要快N多倍,由于数据是以列的形式存储的,它只要找到这个字段,挑出来,直接加总,就不需要扫描完整个表,这节省了很多时间.因此所有的BI都是列数据库,计算速度更快.

其次SQL语言的查询与DAX查询是很类似的,使用的思维逻辑一样,只是语言不太一样,如果你能用SQL语言做一个复杂查询,那同样的,你可以用刚才的SQL查询思路,用DAX语言再写一遍.就像打麻将在不同的地方有不同的规则,但思考的思维习惯是一样的.

还是接上一张图,假如要把销售数量大于平均销售数量的业务员找出来,用SQL应该怎么写呢?

SELECT * FROM [销售记录$] WHERE 销售数量>(SELECT AVG(销售数量) FROM [销售记录$]) ORDER BY 业务员
EVALUATECALCULATETABLE ( '表3', FILTER ( '表3', '表3'[销售数量] > AVERAGE ( '表3'[销售数量] ) ) )ORDER BY '表3'[业务员]

结果一模一样,只是排列顺序不太一样.在SQL里,是先查询出平均值的结果表,然后再将这个结果表与外层的的Select的where条件作对比,把最后的结果筛选出来.

而使用DAX编写查询的思路完全是同样如此.同样是先用FILTER把大于平均销量的结果表查询出来,再将这个结果表做为外层表的筛选条件.

接下来按上面的思路,只是把难度加大点.有这样一张销售表,要把叫王双的所在部门,查询出来一份销售清单

用SQL写:

SELECT * FROM [销售表$] WHERE 销售部门=(SELECT 销售部门 FROM [销售表$] WHERE 姓名='王双') ORDER BY 姓名

用DAX写:

EVALUATECALCULATETABLE ( '表4', '表4'[销售部门] IN ( CALCULATETABLE ( VALUES ( '表4'[销售部门] ), '表4'[姓名] = '王双' ) ))ORDER BY '表4'[姓名] ASC

思路都是类似的,他们都是数据库,都要按数据库的规则来思考,不像电子表格那么灵活(太灵活了,也导致数据不干净...),只是写法稍有区别.

来做一道比较复杂的题目.必修课表里的课程是所有同学必须学的,以这张表为基准,在选课情况表里找出没有学习必修课表里的课程的同学学号找出来,还包括没有学哪些课程.

SQL:

SELECT 学号,课程名称 FROM (SELECT DISTINCT 学号 FROM [选课情况$]),[必修课$] WHERE 学号&课程性质&课程名称 NOT IN (SELECT 学号&课程性质&课程名称 FROM [选课情况$])

结果如下:

DAX:

EVALUATEEXCEPT (CROSSJOIN ( VALUES ( '选课情况'[学号] ), ALLNOBLANKROW ( '必修课'[课程名称] ) ),SELECTCOLUMNS ( '选课情况', '学号', '选课情况'[学号], '课程', '选课情况'[课程名称] ))

无论是DAX还是SQL思路一模一样,都是用必修课程表与学生学号相乘制造迪卡尔积,

然后与选课情况表进行比对.


还有很多挺复杂的数据库查询类的思考题就不一一举例了.如果你过去非常习惯数据库语言SQL,那你会觉得DAX查询如鱼得水,至少学习起来要比其他人快很多.又或许是其它BI工具如Tableau里的函数,比较容易搞懂,学任何BI工具都有一种觉得很容易上手的感觉.


有人认为我拿数据库SQL对比DAX有点装逼的感觉.但其实这不是我首先提出来的,而是我的确在用这种思维规划思考问题,而不是按excel工作表函数的角度.我就把DAX权威指南这本国外的书翻译一下,这本书首先提出这样的观点.

有人问我,如何脑补编写度量公式时脑补中间的过程.我觉得如果不熟练时,可以放弃编写度量公式,而是用插件编写DAX查询表,这个并不难,是一个熟能生巧的实践过程.可以多尝试用插件编写DAX查询表,这样省得在写度量公式时,总要不停的脑补中间过程.在用插件编写查询表时每一步的中间过程都是可以观察到的.写多了,以后在写度量公式时,自然而然的就会脑补出中间过程.

这是以前阅读国外书籍时,我自己编写的大量的DAX查询表时的公式代码.写多了,其实我也没太注意思考上下文的问题.很多复杂的度量公式在编写时,自己自动会脑补出一些中间过程.


EasyCharts团队出品

帅的人都关注了EasyCharts团队^..^~

QQ交流群:553270834

微信公众号:EasyCharts


百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网92to.com,您的在线图书馆!

热点阅读

网友最爱