對編寫DAX查詢非常有用的三個“集合函數”


本文介紹了操作集合的DAX函數的功能,它們對於創建查詢很有用,有時還有助於制定度量。在本文中,我們將“集合函數”稱為對集合進行操作的函數。DAX中可用的三個設置函數是:UNION,INTERSECT和EXCEPT。它們的功能非常直觀:

 

  • UNION執行兩個或更多表的聯合。

  • INTERSECT執行兩個表之間的相交設置。

  • EXCEPT從第一個參數中刪除第二個參數的行。

這些函數將兩個或多個表作為參數並返回一個表。它們不僅對編寫DAX查詢非常有用,而且開發人員在實施措施時也可以使用這些功能來准備復雜的過濾器。

set函數最常使用的功能是保持數據沿襲,這在准備過濾器時至關重要。如果沿襲丟失,則可以使用TREATAS恢復沿襲或強制重新傳承。

我們從設置函數的基礎開始,然后是關於數據沿襲的見解。

 

UNION

 

UNION接受兩個或多個表,並返回一個表,其中所有表的所有行均作為參數接收。結果的結構與源表的結構相同,並且保留重復(如果存在)。如果需要刪除重復項,則可以在UNION上使用DISTINCT。

為了使用UNION來實現示例,我們使用兩個變量表。每個表都包含一個帶有“星期幾”列的表格,每一行代表一個工作日。從周日開始,我們對工作日進行編號。因此,1代表星期日,2代表星期一,7代表星期六。

用Dax表達式創建新表,操作如下圖;

 

 

 

用Dax表達式創建MonTue表,用以下Dax表達式如下:

 

 

這些變量每個都包含兩行。在下面的示例中,我們在兩個表上使用UNION。結果是一個包含源表的所有行的表,包括重復項:

 

 

 

以上結果如我們所見,包含兩個表中的所有行,星期一的重復行不會被刪除。

 

 

DISTINCT

 

DISTINCT被證明對刪除重復項很有用,如下:

 

 

 

 

INTERSECT

 

INTERSECT接受兩個表作為參數。它返回第一個參數中也存在於第二個參數中的所有行,並且保留第一個參數中存在的所有重復項。參數的順序很重要:只有在第一個參數中存在重復項時,才保留重復項。

 

在以下示例中,我們在前面示例中使用的一周的同一天的臨時表上使用INTERSECT。結果僅包含星期一,因為這是兩個表之間唯一的共同工作日:

 

 

 

為了測試重復項,我們添加了SunMonMonWed變量,該變量包含SunMon和MonWed的並集。該表包含星期一兩次;因此,它擁有一個副本:

 

 

 

在下面的示例中,我們在SunMonMonWed使用INTERSECT作為第一個參數,在MonTue上使用第二個參數。結果僅包含星期一,但是重復;的確MonTue包含星期一,沒有在其他日期SunMonMonWed。

 

 

 

更改參數的順序會更改結果。因為星期一僅在MonTue變量中出現一次(我們現在將其用作第一個參數),所以結果僅包含星期一一次。

 

 

 

 

EXCEPT

 

設置功能的第三個也是最后一個是EXCEPT。除接受兩個表作為參數外,它返回表1中不存在於表2中的所有行。使用EXCEPT時,參數的順序至關重要。確實,EXCEPT僅在第一個參數中出現時才保留重復項。

 

作為第一個示例,我們將EXCEPT與SunMon作為第一個參數,將MonTue作為第二個參數。結果是一個只有星期日的表,因為第二個參數中存在星期一,並將其從結果中刪除:

 

 

 

在下一個示例中,我們更改參數的順序。我們將EXCEPT與MonTue作為第一個參數,將SunMon作為第二個參數。結果僅包含星期二,因為它是第二個參數中不存在的唯一工作日。

 

 

 

 

具有不同列名和數據沿襲的表

set函數的參數可能具有不同的列名和不同的數據沿襲。這些函數按其位置將表格中的列匹配。當同一位置的列名稱不同時,結果將使用第一個表中的名稱。

 

關於數據沿襲,其行為取決於set函數:當自變量的數據沿襲不同時,UNION丟失數據沿襲,而INTERSECT和EXCEPT都保留其第一個自變量的沿襲。

 

我們將通過一些示例看到UNION在實踐中的一些行為。

第一個示例顯示UNION與不同的列名一起使用。下面的代碼在三個不同的表上使用UNION,其中一列在每個表中具有不同的名稱。結果使用第一個表中的列名:

 

 

 

第二個示例顯示了在具有相同數據沿襲的兩個表上使用UNION時,數據沿襲得以保留。為此,我們在第一個代碼示例中添加了度量評估。根據“星期幾”列,結果每一行包含一個不同的值:

 

 

 

以上結果,由於兩個表的數據沿襲都在同一日期” [星期幾]列中,因此UNION保留數據沿襲。星期一出現兩次,因為UNION不會刪除重復項。

在下一個示例中,當對具有不同數據沿襲的表使用UNION時,數據沿襲將丟失。我們更換MonTueMyMonTue包含相同的日子,但沒有數據沿襲。由於UNION的兩個自變量具有不同的數據沿襲,因此結果將丟失數據沿襲。此外,度量的評估為所有行產生相同的數字;

 

 

如果需要,我們可以使用TREATAS恢復數據沿襲。為了證明這一點,我們創建了MyMonTueDataLineage變量,該變量使用TREATAS恢復數據沿襲。現在,由於恢復了數據沿襲,因此結果是一周中每一天的銷售額:

 

 

 

 

列數不同的表

set函數均不接受具有不同列數的參數。

在以下示例中,我們在SunMon(兩列)和MonTue(一列)上使用EXCEPT。結果是一個錯誤:

 

 

具有不同列類型的表

如果set函數的參數具有相同的列數,但對應的列具有不同的數據類型,會發生什么情況?在這種情況下,UNION的行為不同於INTERSECT和EXCEPT。實際上,UNION將列類型從數字轉換為字符串,而INTERSECT和EXCEPT則不進行任何轉換,而是返回錯誤。另一方面,數字類型之間的轉換適用於所有設置的函數。

在下面的示例中,我們創建兩個表,T1,其中STRING和INTEGER類型的兩列,T2,具有相反的配置。然后,我們應用UNION,該表返回包含兩列的表,這兩列均為STRING類型;

 

 

 

帶有INTERSECT或EXCEPT的相同示例返回錯誤:

 

 

最后一個示例顯示了使用INTERSECT在兩個不同數值類型之間的有效轉換。返回的表包含1,這是T1和T2之間的交集:

 

 

 

 結論

 

集合函數的優點在於它們易於使用,並且通常可以完全按我們期望的那樣工作。使用設置函數時最相關的主題是數據沿襲。通過遵循本文概述的規則,我們就可以輕松預測數據沿襲是保留還是丟失。萬一丟失,可以使用TREATAS進行恢復。

 

 

推薦閱讀

 

Power BI + Azure Synapse,打造出色分析體驗!

利用好這3個隱藏技巧,Power BI 開發體驗更絲滑

Power BI數據流——新圖表視圖

Power BI 11月功能更新 —— 視頻上線

如何自動播放 Power BI 移動應用的幻燈片

 

技術交流

1.Power BI免費下載:http://www.yeacer.com/

    Microsoft Power BI Desktop中文最新版:下載地址

2.歡迎加入的Power BI技術群,目前正在學習階段,有興趣的朋友可以一起學習討論。 

   Power Data技術交流群:702966126 (驗證注明:博客園Power BI) 

   更多精彩內容請關注微信公眾號:悅策PowerBI          


如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!歡迎各位轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM