前言
我們已經創作了大量關於DAX的內容,比如那些關於Power Pivot和SSAS表格模型的書、博客、文章、白皮書,以及一本關於DAX Patterns的著作。還有必要再為DAX另外寫一本書嗎?這門語言值得花這麼多精力嗎?當然,我們認為答案是肯定的。
當一本書誕生時,編輯首先關心的是它的頁數。這一點之所以重要,是因為頁數涉及定價、管理和資源的分配等。這多少讓作者有一點沮喪。事實上,每次寫書時,我們都需要謹慎分配關於產品(無論是Excel Power Pivot還是SSAS表格模型)和DAX語言描述所占的資源。沒有足夠的篇幅讓我們對DAX暢所欲言的感覺是痛苦的。畢竟,你不可能寫1000頁關於Power Pivot的內容,這種體量的書對任何人來說都是一場噩夢。
因此,這些年來,我們在撰寫關於Power Pivot和SSAS表格模型的書的同時,也編寫了一本繫統闡述DAX的書,隻不過它暫時被封存。現在,我們決定打開封印,不再糾結摘錄哪一部分內容——我們將介紹關於DAX的所有細節,不做任何刪減,這就是本書的由來。
本書不介紹如何創建計算列,不告訴你在哪個對話框中可以設置哪些屬性。因為這不是一本手把手教你使用Visual Studio、Power BI和Power Pivot的書。相反,它將深入介紹DAX語言,從入門開始一直到非常技術化的細節,來指導你如何優化自己的代碼和模型。
在創作過程中,我們對它的每一頁都愛不釋手,無數次回顧這些內容,以至於可以倒背如流。每當我們認為有重要的內容要補充時,就會繼續添加內容。這讓本書的頁數隻增不減,因為每一頁都是有價值的。在此期間,我們加深了對DAX的理解並且享受整個創作過程。
但還有一件事情需要說明,為什麼你需要這樣一本關於DAX的書?
在你第一次使用Power Pivot或Power BI之後可能就有了這種想法。拜托,你不是一個人,我們第一次使用之後也產生了這個困惑。DAX看起來太簡單了!它和Excel函數是如此相似!而且,如果你學習過其他編程語言或查詢語言,那麼你可能已經習慣參照語法實例、套用已經掌握的思維模式來學習一門新的語言。這些都是我們在學習DAX過程中犯過的錯誤,希望你不要重蹈覆轍。
DAX是一門強大的語言,支持這門語言的分析工具正在不斷增加。但在強大的背後,它的一些原理很難通過歸納法(從具體實例推導出普遍規律的一種方法)來理解。例如,對計值上下文(Evaluation Context)的理解需要用到演繹推理:先接觸理論本身,再通過案例加深對理論的理解。我們知道很多人都不習慣這種學習方式,他們更喜歡在實踐中學習,即先研究如何解決具體問題,再通過不斷的練習和積累,歸納出公式背後的原理。如果你也希望使用這種方式學習,那麼本書可能不適合你。我們另有一本書:DAX Patterns,它是一本面向實戰的案例集,不包含公式原理的解釋,也不會告訴你為什麼公式寫成這樣效率更高,它適合讓你以直接套用的方式解決實際問題。但本書的目的是讓你真正掌握DAX。基於此,本書中所有的案例都是為了解釋DAX語言的行為,而非解決特定問題。如果你發現書中的某些公式恰好可以應用到你的模型裡,那麼恭喜你。但請記住,這隻是意外之喜,並非案例的本意。最後,請務必留意書中的注解,以確保理解案例中的代碼所包含的陷阱。出於講解的目的,書中使用的公式源碼通常並非最佳實踐。
希望你能和我們一起享受這段學習DAX的美妙旅程,就像當初我們寫這本書時那樣。
本書受眾
如果你隻是偶爾會使用DAX,那麼本書或許不是最佳選擇。市面上已經有很多書提供了DAX相關工具和語言本身的簡明介紹,它們可以幫助你從零開始達到基礎級別的DAX編程水平。我們對此非常了解,因為我們也寫過類似的書。
而如果你是抱著認真的態度學習DAX,想要了解這門優美語言的所有細節,那麼本書就是為你準備的。如果這是你學習DAX的第一本書,那麼請不要期望太早領悟那些高級概念。建議你首先通讀全書,等到積累一些經驗後再重讀那些最復雜的章節,那時你會對它們有更清晰的了解。
不同職位、不同目的的人都可以從DAX中獲益,Excel用戶可以利用DAX操控Power Pivot數據模型,商業智能(BI)專家需要在不同規模的BI解決方案中編寫DAX代碼,非專業Power BI使用者需要在自助BI模型中編寫DAX公式。不同的人群在本書中都能找到適合自己的內容。某些內容(特別是性能優化部分)更適合BI專家,因為用於優化DAX度量值的知識具備比較高的技術性;但我們認為Excel用戶同樣需要了解DAX表達式之間的性能差異,以便獲得最佳的模型運行效果。
最後,你需要不斷從本書中學習,而不能僅僅停留在閱讀階段。我們保持入門部分的內容的通俗易懂,並遵循從零開始學DAX的邏輯路徑。然而,當其中涉及的概念開始變得復雜時,我們將不再試圖簡化它,而是回歸真實。DAX不是一門簡單的語言,掌握它和理解引擎的每處細節花費了我們多年的時間,不要奢望隨手翻翻本書就能明白全部內容。你在閱讀本書時要高度集中注意力。作為回報,我們提供了關於DAX各個方面的內容,且這些內容是前所未有的,以助你成為一名真正的DAX專家。
準備知識
我們希望本書讀者在Power BI和數據分析方面具備一定的基礎知識,如果你對DAX有過一些接觸,這對你有好處,它能幫助你更快地閱讀本書第一部分內容。當然,了解DAX不是必需的。
本書部分內容引用了MDX和SQL代碼,但你不必預先了解這些語言,因為它們隻是反映不同表達式之間的區別,即使你不了解這些代碼也沒有關繫。這意味著那些特定主題不是為你準備的。
在本書最復雜的高級內容部分,我們介紹了並行計算、內存訪問、CPU使用,以及其他過於高深、讓大部分讀者可能感到陌生的知識。開發人員熟悉這些內容,而Excel高級用戶可能有點畏懼。不過,當涉及優化內容時,這些信息是必需的。因此,本書最復雜的部分面向BI開發人員而不是Power BI和Excel用戶。然而,我們相信每個閱讀過它的人都會從中受益。
本書編排
本書在內容設計上遵循合理的邏輯順序,從入門內容逐步深入到復雜內容。每章的內容在撰寫時都基於之前內容被完全理解的基礎之上;幾乎不會重復前面介紹過的概念。正因如此,我們強烈建議讀者在首次閱讀本書時采用從頭至尾的方式繫統學習,不要提前跳到復雜章節。
讀過一次之後,它就可以成為你學習DAX的參考書。例如,如果你對ALLSELECTED函數的原理不是很明白,則可以直接翻到講解這個函數的那章打消疑問。不過,在缺少對之前內容理解的情況下,閱讀該部分可能無法達到預期效果,甚至會遇到更糟糕的情況:產生片面或錯誤的理解。
以下是各章節內容概覽。
? 第1章是對DAX的簡要介紹,其中有些內容是專門針對已經有其他編程語言基礎的用戶,比如SQL、Excel或MDX。本章沒有引入任何新概念,隻給出你可能已經知道的,一些關於DAX和其他語言差異的提示。
? 第2章介紹DAX語言的概況,涵蓋計算列、度量值、錯誤處理函數等基本概念,並列出DAX的大部分基礎函數。
? 第3章專門介紹基礎表函數。DAX的許多函數都使用表作為參數或返回表作為結果。本章內容涵蓋最基本的表函數。高級表函數將在第12章和第13章中介紹。
? 第4章專門介紹計值上下文。計值上下文是整個DAX語言的基石,本章連同第5章,是整本書最重要的內容。
? 第5章隻介紹兩個函數:CALCULATE和CALCULATETABLE。它們是DAX中最重要的函數,是否理解計值上下文將直接決定你能否用好這兩個函數。
? 第6章介紹變量。在本書的案例中使用了大量的變量,本章專門介紹它們的語法並解釋如何使用變量。當你在接下來的章節中看到大量使用變量的例子時,本章內容將是非常有參考性的。
? 第7章介紹迭代器和CALCULATE函數:二者是“天作之合”。學習如何使用迭代器,以及上下文轉換,可以充分發揮DAX的強大功能。本章中會介紹幾個有助於理解如何利用這些工具的例子。
? 第8章深入闡述時間智能計算,包括年初至今、月初至今、去年同期、基於周的時間段和自定義日期表等常用計算。
? 第9章專門介紹DAX中引入的最新特性:計算組(Calculation Groups)。計算組是非常強大的建模工具。本章介紹如何創建和使用計算組,以及計算組的基本概念,並展示了一些示例。
? 第10章介紹篩選上下文的更高級用法,比如數據沿襲、對篩選上下文的檢查及編寫高級公式的有用工具。
? 第11章介紹如何對層級結構執行計算,以及如何使用DAX處理父/子結構。
? 第12章和第13章介紹對編寫查詢和/或執行高級計算都很有用的高級表函數。
? 第14章進一步介紹計值上下文的知識,並在擴展表理論的幫助下介紹諸如ALLSELECTED和KEEPFILTERS之類的復雜函數。本章內容屬於高級內容,揭示了復雜DAX表達式的大部分秘密。
? 第15章介紹如何管理DAX中的關繫。實際上,借助DAX,任何類型的關繫都可以在數據模型中被設置。本章介紹分析型數據模型中常見的多種類型的關繫。
? 第16章介紹幾個用DAX解決的復雜計算案例。這是關於DAX語言的最後一章,本章有助於讀者發現解決方案和產生新的想法。
? 第17章詳細描述VertiPaq引擎,它是運行DAX模型時最常用的存儲引擎。了解這一點,對於學習如何在DAX公式中獲得最佳性能至關重要。
? 第18章基於第17章的內容,介紹數據模型級別可用的優化手段。讀者會在本章學到何時規範化模型,如何減少列基數,如何設置關繫和使用最少的內存以在DAX中獲得最佳性能。
? 第19章介紹如何讀懂查詢計劃,以及如何借助DAX Studio和SQL Server Profiler等工具來評估DAX查詢的性能。
? 第20章基於之前章節介紹的優化知識,介紹一些技術解決方案,本章首先展示示例公式,然後評估它們的性能,最後解釋並給出優化後的公式。