打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DAX查询进阶:驾驶DAX Studio

没有爱上车是因为还没学会驾驶。

前情回顾

在上一篇DAX查询入门:DAX Studio介绍中,我们已经初步了解了DAX Stuido。
它提供的能力包括:

  • DAX查询编写

  • DAX查询/DAX代码格式化

  • 数据模型元数据查看

  • 当前DAX引擎支持函数查看

  • 当前DAX引擎DMV

  • DAX查询结果查看

  • DAX查询结果数据导出

  • DAX引擎运行监控(为代码优化做准备)

  • DAX引擎时间跟踪

  • DAX代码性能优化
    我们初步了解了:

  • Excel透视表可以用等效的DAX查询表示

  • DAX查询可以表示出任意复杂的查询结果,这种能力远远超过Excel透视表本身

  • DAX Studio是编写DAX查询的强大武器

  • DAX Studio除了编写DAX查询外,还具备其他更多特性

  • 理解如何借助DAX Studio完成DAX查询与Excel的连接

  • 理解如何直接在原生Excel中实现DAX查询

  • 理解如何在Power BI Desktop中进行DAX查询

  • 理解如何借助DAX Studio测试DAX查询(返回表或返回值)

本文将详细说明畅快驾驶DAX Studio的方法。

现在打开你的DAX Studio以及示例文件Contoso.pbix(你可以使用自己的测试文件)。如下:

DAX查询编写

DAX查询的语法为:
根据 微软官方DAX查询参考 可知:
DAX 语言提供了一种新语法,可从查询中返回表数据。
通过 DAX 查询,用户可从内存分析引擎 (VertiPaq) 来检索由表表达式定义的数据。 用户可将度量值作为查询的一部分创建;查询结束后,这些结果会被释放,除非导出这些结果。

DAX 查询 的语法如下:

[DEFINE {  MEASURE [] = }EVALUATE [ORDER BY { [{ASC | DESC}]}[, …][START AT {|} [, …]]]

具体参考微软官方文档,不做过多说明。

其中,EVALUATE是重点。包含用于生成查询结果的表表达式。 表达式可以使用任何定义的度量值。表达式必须返回表。 如果需要标量值,则度量值的作者可以将其标量包装在 ROW() 函数内,以便生成包含所需标量的表。

在DAX中,常见的返回表的情况包括:

  • 直接返回表本身,如:

    EVALUATE Product
  • 返回被过滤的表,如:

    EVALUATEFILTER ( 'Product', 'Product'[Color] = 'red' )
  • 返回CACULATETABLE计算后的表,如:

    EVALUATECALCULATETABLE (  DISTINCT ( 'Product'[Product Name] ),  'Product Category'[Category] = 'audio')
  • ALL和VALUES也是返回表的函数,在DAX Studio中可以很好的看到它们的特性,如:

EVALUATEALL('Product Category'[Category])EVALUATEVALUES('Product Category'[Category])

结果如下:

注意:DAX Studio 2.6 开始支持返回多结果,也就是一次性写多个EVALUATE进行计算。

另外一个结果是:

发现了吗?ALL和VALUES在这种情况下返回的结果是一样的。你还可以自行实验有 重复值 列的情况。

流畅的代码编写体验

之所以说当你熟悉了DAX的感觉后会不能再没有她,正是因为她能帮助你流畅地编写DAX代码。这表现在:

  • DAX 函数及模型元数据智能感知,如:

DAX Studio 可以自动识别当前DAX引擎可用的DAX函数以及当前模型的元数据(表及列)并迅速进行提示,这使得编写代码的速度很快。

  • DAX 代码着色及格式化
    DAX Studio 使用DAXFormatter.com对代码进行格式化,如下:

点击:

得到:

在编写复杂的 DAX 查询 时,代码着色以及括号匹配能帮助我们避免很多错误。

  • 语法检测及错误提醒
    如果你的代码出现错误,DAX Studio可以进行语法检查并帮助排除错误。例如在上述的DAX查询中,对[Category Code]不小写多写了一个空格成为[Category Code ],这也是不允许的,DAX Studio会报错,如下:

DAX Studio 帮助锁定了出错的位置是第4行第17列,并提示了错误信息“找不到列Category Code 或该列不能用于此表达式”。

DAX 查询编写最佳实践

基于DAX查询具有的特点:DAX查询是嵌套进行的。可以逐层地来构造查询,以确保在每一步都可以进行调试。

注意利用 DAX Studio 2.6 版本以后可返回多结果的功能。

例如:构建一个返回分类及子分类下销售额汇总的表。这个在DAX Studio中逐步编写代码的过程大致如下:

DEFINE    //定义度量值计算销售额    MEASURE Sales[Total Sales] =        SUMX ( Sales, Sales[Net Price] * Sales[Quantity] )EVALUATE//总销售额ROW ( 'values', [Total Sales] )EVALUATE//生成类别层级表SELECTCOLUMNS (    GENERATE ( 'Product Category', RELATEDTABLE ( 'Product Subcategory' ) ),    'Category', 'Product Category'[Category],    'Sub Category', 'Product Subcategory'[Subcategory])EVALUATE//为类别层级表添加销量ADDCOLUMNS (    SELECTCOLUMNS (        GENERATE ( 'Product Category', RELATEDTABLE ( 'Product Subcategory' ) ),        'Category', 'Product Category'[Category],        'Sub Category', 'Product Subcategory'[Subcategory]    ),    'Total Sales', [Total Sales])

可以看出在上述过程中,并没有删除每一步的代码,而总是利用每一次的代码继续下一步。并得到结果:

可以发现,有的类别层级组合是没有销售额的,不希望显示这样的结果,于是可以进一步用FILTER来进行过滤,甚至进一步格式化输出结果,如下:

EVALUATE//为类别层级表添加销量并过滤空行//格式化输出结果FILTER (    ADDCOLUMNS (        SELECTCOLUMNS (            GENERATE ( 'Product Category', RELATEDTABLE ( 'Product Subcategory' ) ),            'Category', 'Product Category'[Category],            'Sub Category', 'Product Subcategory'[Subcategory]        ),        'Total Sales', FORMAT( [Total Sales] / 10000 , '0.0W' )    ),    ISBLANK ( [Total Sales] ) = FALSE () && [Total Sales] <> '')

结果为:

这已经很完美。

尤其是在编写复杂的 DAX 查询 时,可以采用逐步测试的方法并配合注释使得DAX代码可以被长期维护。

使用DAX Studio理解模型中的元数据

DAX Studio可以帮助分析师了解模型的元数据,如下:

包括Power BI Desktop自动生成的代码,例如:Power BI Desktop会自动为每个日期列添加一个适用于时间智能的隐藏日期表。这个隐藏的日期表在Power BI Desktop默认是看不到的,但是在DAX Studio中却一览无遗。

如果禁用Power BI Desktop自动生成日期表的功能,如下:

此时回到DAX Studio中查看模型的元数据将不再存在隐藏的日期表,如下:

使用DAX Studio理解所有DAX函数

DAX Studio可以读取DAX引擎支持的所有函数,如下:

这可以帮助分析师快速了解所有的DAX函数,包括DAX引擎更新后可能新加入的函数。

使用DAX Studio初步理解DMV并使用Power BI Desktop作为分析服务

Analysis Services Dynamic Management Views (DMV),即:分析服务的动态管理视图,它提供了对当前运行的分析服务动态信息进行查询的接口。如下:

由于Excel Power Pivot,Power BI Desktop以及SSAS均使用分析服务引擎,所以都具备这个DMV。通过查询DMV,用户可以知道由于当前分析服务的几乎所有信息,这为基于Power BI Desktop的高级应用提供了基础。

例如:DMV透露了作为当前分析服务的实例,那便可以使用该实例作为服务器。将Excel作为客户端,与之进行连接。

这里显示了端口号:

用Excel作为客户端工具与之连接,如下:

输入刚刚在DAX Studio中得到的连接信息,如下:

Excel提示可以与当前的分析服务连接,如下:

此时,在Power BI Desktop定义的模型便可以直接在Excel中使用了,如下:

至此,Excel与Power BI Desktop完全连接起来,不需要在Excel中建立数据模型一样可以直接对数据模型加以利用。

有关DMV的深度利用,超出了本文范围,后续再做描述。

使用DAX Studio输出DAX查询

这又是一项DAX Studio非常出彩的功能。我们知道在Excel中单表限制是100W行数据;而在Power BI Desktop中又无法导出数据。这就存在一个问题,那就是:是否可能将加载进数据模型(Excel 数据模型或Power BI Desktop数据模型)的大数据量级事实表(如:超过1000W行)导出?

对于分析师而言,这是一个非常重要的功能。这项功能也是由DAX Studio提供的。

在示例PBI文件中便使用了多达1200W行的销售数据,如下:

EVALUATEROW ( 'rows of sales', COUNTROWS ( Sales ) )

结果:

这甚至不能只能在DAX Studio的输出视图中显示,这有可能导致内存不足。但可以通过DAX Studio把输出目标改为文件,这样就像在内存数据模型与硬盘目标文件之间建立了管道,数据像流水一样,顺畅地流入目标文件。

在DAX Studio设置输出目标为:

执行这项“危险”的操作如下:

EVALUATESales

执行查询,并设置保存的文件格式为CSV格式:

DAX Studio大致以每秒15000行的速度导出数据:

如果此时观察任务管理器,可以看到:

DAX Studio进程以全速工作,并以1.5~2M/S每秒的速度与磁盘交互,在它身边正是Power BI Desktop启动的本地分析服务。
导出结果如下:

文件大小为2G。Power BI Desktop源文件(包含Sales在内所有模型表)整个大小为300M。DAX引擎的压缩能力在此也可见一斑。

分析师电脑配置在硬盘方面使用固态硬盘便是为此处考虑。增加硬盘的读写速度,对于大数据量级数据读写有明显优势。

总结

至此,现在我们已经可以基本驾驶DAX Studio完成大多数DAX查询相关工作,包括:

  • 流畅地编写DAX查询。

  • 使用DAX Studio实现逐步编写DAX查询。

  • 使用DAX Studio学习理解所有DAX函数。

  • 使用DAX Studio理解模型的元数据。

  • 初步使用DAX Studio理解DMV。

  • 使用DAX Studio导出DAX查询。

如果说现在已经可以通过DAX Studio畅快地驾驶DAX查询,那还有最后一个阶段,那就是:透彻地理解DAX引擎,完成修车,弯道急速超车等高难度动作。

推荐<极品飞车>>这一电影,其中一个片段是:

有好车,不一定人人能开出极速。所有的分析师都可以使用Power BI Desktop,但真正的高手是能开出极速的。

其中还有一个片段:

梦想,比工作更重要。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
度量值、计算列和查询的区别
Excel数据自由:得到一个干净的超级表 - 用Power Query访问数据模型
这个函数让开发Power BI的过程变得简单了:DAX和数据模型
【Power BI】在 Power BI 中设计数据模型创建日期表
怎么将PP或PBI里的数据导出到Excel文件?
Power BI Desktop 中的 DAX 基本概念
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服