电竞比分网-中国电竞赛事及体育赛事平台

分享

數(shù)據(jù)類型和運(yùn)算符

 優(yōu)雅野人 2022-05-20 發(fā)布于湖北

數(shù)據(jù)類型

DAX 可以使用七種常用的數(shù)據(jù)類型進(jìn)行計(jì)算。在下面的列表中,我們展示了同一種數(shù)據(jù)類型在 DAX 種的名稱和它更常見的名稱。例如,布爾值(Boolean values)在 DAX 術(shù)語中被稱為 TRUE/FALSE。我們更愿意遵循事實(shí)上的命名標(biāo)準(zhǔn),將它們稱為布爾值。除此之外,還有兩種比較特殊的類型會(huì)在最后介紹

  • 整數(shù) (Integer)
  • 十進(jìn)制數(shù) (Float)
  • 貨幣 (Currency), 內(nèi)部存儲(chǔ)為整數(shù)的固定小數(shù)
  • 日期 (DateTime)
  • 布爾值 (TRUE/FALSE)
  • 文本 (String)
  • 二進(jìn)制 (Binary)
  • Blank/Null 類型
  • 變體(Variant) 類型

DAX 數(shù)據(jù)類型在不同工具中使用的名稱

DAX 有一個(gè)強(qiáng)大的類型處理系統(tǒng),因此你不必?fù)?dān)心數(shù)據(jù)類型:當(dāng)你編寫 DAX 表達(dá)式時(shí),結(jié)果的類型基于表達(dá)式使用的術(shù)語類型自動(dòng)調(diào)整。我們稱之為隱式轉(zhuǎn)換,但在某些情況下,它不會(huì)進(jìn)行轉(zhuǎn)換。 例如,如果 DAX 函數(shù)需要日期數(shù)據(jù)類型,而你的列的數(shù)據(jù)類型為文本,DAX 函數(shù)將不能正常工作。 因此,獲取適用于列的正確數(shù)據(jù)類型是重要并且有用的,如果 DAX 表達(dá)式返回的類型不是預(yù)期的類型,你需要須檢查表達(dá)式使用的術(shù)語的數(shù)據(jù)類型。

例如,如果某列的數(shù)據(jù)類型是日期,那么求和的結(jié)果也是日期;然而,如果對(duì)整數(shù)使用相同的運(yùn)算符,則結(jié)果是整數(shù)。這就是運(yùn)算符重載,你可以在下圖中看到它的行為示例,其中 OrderDatePlusOneWeek 列是通過在 Order Date 列的值上增加 7 來計(jì)算的。結(jié)果,就像我們說的,是一個(gè)日期。

向日期列添加一個(gè)整數(shù)會(huì)導(dǎo)致日期增加相應(yīng)的天數(shù)

除了運(yùn)算符重載之外,在需要時(shí) DAX 還會(huì)自動(dòng)將字符串轉(zhuǎn)換為數(shù)字,或者將數(shù)字轉(zhuǎn)換為字符串。例如,如果使用連接字符串的&運(yùn)算符,DAX 將把它的參數(shù)轉(zhuǎn)換成字符串。例如:

  • = 5 & 4

將返回字符串形式的“54”,另一公式

  • = "5" + "4"

返回?cái)?shù)值型結(jié)果 9

結(jié)果值依賴于運(yùn)算符,而不是引用的列,列根據(jù)運(yùn)算符的要求進(jìn)行轉(zhuǎn)換。即使這種行為看起來很方便,稍后你將看到在這些自動(dòng)轉(zhuǎn)換期間可能發(fā)生哪些錯(cuò)誤。我們建議避免自動(dòng)轉(zhuǎn)換。如果需要進(jìn)行某種轉(zhuǎn)換,那么最好主動(dòng)介入并使用顯示轉(zhuǎn)換。比如上面的例子應(yīng)該使用:

  • = VALUE ( "5" ) + VALUE ( "4" )

熟悉 Excel 或其他語言的人可能更熟悉 DAX 數(shù)據(jù)類型。你可以在這里找到關(guān)于 DAX 數(shù)據(jù)類型的規(guī)范。然而,對(duì)于每一種數(shù)據(jù)類型介紹一些注意事項(xiàng)是很有必要的。

整數(shù) (Integer)

DAX 只有一個(gè)整數(shù)數(shù)據(jù)類型,存儲(chǔ) 64 位的整數(shù)。DAX 中的整數(shù)值之間的所有內(nèi)部計(jì)算都使用 64 位整數(shù)。 它支持 19 位數(shù);從 -9,223,372,036,854,775,807 (-2^63+1) 到 9,223,372,036,854,775,806 (2^63-2) 的正數(shù)或負(fù)數(shù)。 在需要控制舍入的情況下,整數(shù)類型非常有用。

Power BI Desktop 數(shù)據(jù)模型支持 64 位整數(shù)值,但由于存在 JavaScript 限制,因此視覺對(duì)象可安全表達(dá)的最大數(shù)字是 9,007,199,254,740,991 (2^53-1)。 如果在數(shù)據(jù)模型中使用大于以上值的數(shù)字,可在將該數(shù)字添加到視覺對(duì)象前,通過計(jì)算減小其大小

十進(jìn)制數(shù)(Float)

十進(jìn)制數(shù)總是以雙精度浮點(diǎn)值的形式存儲(chǔ)。不要將這種 DAX 數(shù)據(jù)類型與 Transact-SQL 的十進(jìn)制和數(shù)字?jǐn)?shù)據(jù)類型混淆:在 SQL 中,DAX 十進(jìn)制數(shù)字的對(duì)應(yīng)數(shù)據(jù)類型是浮點(diǎn)。

貨幣(Currency)

貨幣數(shù)據(jù)類型存儲(chǔ)固定的十進(jìn)制數(shù)。它可以表示為 4 位的小數(shù),內(nèi)部存儲(chǔ)為 64 位的整數(shù)值除以 10000。在貨幣數(shù)據(jù)類型之間執(zhí)行的所有計(jì)算總是忽略 4 位小數(shù)點(diǎn)后面的小數(shù)。如果需要更精確的數(shù)據(jù),則必須進(jìn)行十進(jìn)制數(shù)據(jù)類型的轉(zhuǎn)換。

貨幣數(shù)據(jù)類型的默認(rèn)格式包括貨幣符號(hào)。還可以將貨幣格式應(yīng)用于整數(shù)和十進(jìn)制數(shù),還可以使用一種不帶貨幣符號(hào)的格式來表示貨幣數(shù)據(jù)類型。

當(dāng)表達(dá)式包含不同數(shù)據(jù)類型之間的乘法和除法時(shí),需要關(guān)注是否涉及貨幣數(shù)據(jù)類型。因?yàn)樵谟?jì)算中進(jìn)行類型轉(zhuǎn)換的位置不同可能會(huì)產(chǎn)生不同的結(jié)果。貨幣數(shù)據(jù)類型對(duì)于避免聚合中的某些舍入錯(cuò)誤非常重要,但是應(yīng)該謹(jǐn)慎地管理它,以避免復(fù)雜表達(dá)式產(chǎn)生意外的舍入錯(cuò)誤。

日期/時(shí)間(Datetime)

DAX 在日期/時(shí)間數(shù)據(jù)類型中存儲(chǔ)日期。這種格式內(nèi)部使用浮點(diǎn)數(shù),其中整數(shù)對(duì)應(yīng)于 1899 年 12 月 30 日以來的天數(shù),而小數(shù)部分則表示當(dāng)天的份數(shù)。小時(shí)、分鐘和秒被轉(zhuǎn)換成一天的小數(shù)部分。因此,下面的表達(dá)式返回當(dāng)前日期加上一天(正好是 24 小時(shí)):

  • = NOW()+1

它的結(jié)果是在計(jì)算當(dāng)前時(shí)間的明天的日期,如果你只需要使用日期/時(shí)間的日期部分,可以使用 TRUNC 函數(shù)來刪除小數(shù)部分。

Power BI 還提供另外兩種數(shù)據(jù)類型:日期類型和時(shí)間類型。在引擎內(nèi)部,它們是日期/時(shí)間的簡單變體。實(shí)際上,兩種類型分別只存儲(chǔ)日期/時(shí)間的整數(shù)部分或小數(shù)部分。

閏年錯(cuò)誤

1983 年發(fā)布的流行電子表格程序 Lotus 1-2-3 在處理 DateTime 數(shù)據(jù)類型時(shí)出現(xiàn)了一個(gè)錯(cuò)誤。它認(rèn)為 1900 年是閏年,盡管事實(shí)并非如此(一個(gè)世紀(jì)的最后一年是閏年,前提是前兩位數(shù)字除以 4 沒有余數(shù))。當(dāng)時(shí),Excel 第一版的開發(fā)團(tuán)隊(duì)故意復(fù)制了這個(gè) bug,以保持與 Lotus 1-2-3 的兼容性。從那以后,出于兼容性考慮,Excel 的每一個(gè)新版本都把這個(gè) bug 作為一個(gè)特性來維護(hù)。

為了保持與 Excel 的向后兼容,目前這個(gè) bug 仍然在 DAX 中。Bug 的存在(或者我們應(yīng)該稱之為特性嗎?)可能會(huì)導(dǎo)致 1900 年 3 月 1 日之前出現(xiàn)錯(cuò)誤。因此,根據(jù)設(shè)計(jì),DAX 的第一個(gè)官方支持的日期是 1900 年 3 月 1 日。在此日期之前執(zhí)行的日期計(jì)算可能會(huì)導(dǎo)致錯(cuò)誤,應(yīng)該被認(rèn)為是不準(zhǔn)確的。

DAX 中的 1 代表 1899 年 12 月 31 日,而 EXCEL 是 1900 年 1 月 1 日,存在這種差別的原因是 Lotus 1-2-3 的最初版本有一個(gè) bug,認(rèn)為 1900 是一個(gè)閏年,其中包括 1900 年 2 月 29 日。實(shí)際上 1900 年不是閏年,所以在 1900 年 3 月 2 日之前的日期在 Lotus 1-2-3 中被誤寫了。由于蓮花的電子表格在當(dāng)時(shí)非常受歡迎,為了與其競爭,微軟在自家的 EXCEL 上繼承了這個(gè) bug 以便用戶可以無縫切換。DAX 的開發(fā)者對(duì)這個(gè) Bug 采用了另一種不同的實(shí)現(xiàn)方式,導(dǎo)致在這個(gè)特定的時(shí)間段內(nèi),DAX 與 Excel 存在 1 天的差距。

如果你需要在 1900 年之前進(jìn)行計(jì)算,你應(yīng)該使用數(shù)學(xué)方法來將其移動(dòng)到 1900 年之后的日期,執(zhí)行計(jì)算,然后再平移回去。

布爾值(TRUE/FALSE)

布爾數(shù)據(jù)類型用于表示邏輯條件。例如,由以下表達(dá)式定義的計(jì)算列類型為布爾型:

  • = Sales[Unit Price] > Sales[Unit Cost]

你也可以將布爾數(shù)據(jù)類型視為數(shù)字,其中 TRUE=1 和 FALSE=0。這在排序時(shí)很有用,因?yàn)?TRUE >FALSE。相反的,如果在邏輯判斷中直接使用數(shù)字,那么 0 將會(huì)被視為 FALSE,例如下面的表達(dá)式始終返回空

  • FILTER(Table,0)

文本(String)

DAX 中的每個(gè)字符串都存儲(chǔ)為 16 位 Unicode 字符串。默認(rèn)情況下,字符串之間的比較是不區(qū)分大小寫的,因此這兩個(gè)字符串“PowerPivot”和“POWERPIVOT”是相等的。

PowerQuery 比較字符串時(shí)默認(rèn)區(qū)分大小寫,這是兩者的一個(gè)不同點(diǎn),需特別留意。如果你使用的是 Analysis Services 表格模型,可以自行設(shè)置是否區(qū)分大小寫

二進(jìn)制(Binary)

二進(jìn)制數(shù)據(jù)類型用于在數(shù)據(jù)模型中存儲(chǔ)圖像,在 DAX 中無法訪問該數(shù)據(jù)類型。它主要被 Power View 或其他客戶端工具用來顯示直接存儲(chǔ)在數(shù)據(jù)模型中的圖片。在 Power BI 等其他工具中可能無法使用

在圣經(jīng)第一版中此處使用的格式類型是二進(jìn)制大對(duì)象(BLOB)

空白/Null 類型

BLANK 不對(duì)應(yīng) SQL 中的 NULL。DAX 中的 BLANK 不遵循 NULL 在 SQL 中的計(jì)算邏輯。在中間結(jié)果可能是 BLANK 的表達(dá)式中,必須注意這種區(qū)別。 你可以使用 BLANK 函數(shù)創(chuàng)建空白,并使用 ISBLANK 對(duì)其進(jìn)行測試。

關(guān)于空白、空字符串和零值的處理:

表達(dá)式 DAX Excel
BLANK + BLANK BLANK 0(零)
BLANK + 5 5 5
BLANK * 5 BLANK 0(零)
5/BLANK 無窮大 錯(cuò)誤
0/BLANK NaN 錯(cuò)誤
空白/空白 BLANK 錯(cuò)誤
FALSE OR BLANK FALSE FALSE
FALSE AND BLANK FALSE FALSE
TRUE OR BLANK TRUE TRUE
TRUE AND BLANK FALSE TRUE
BLANK OR BLANK BLANK 錯(cuò)誤
BLANK AND BLANK BLANK 錯(cuò)誤

關(guān)于 BLANK 的更多注意事項(xiàng),請(qǐng)?jiān)陂喿xBLANK 的函數(shù)介紹

變體/Variant 類型

變體數(shù)據(jù)類型用于可能返回不同數(shù)據(jù)類型的度量值,具體取決于度量值使用的條件表達(dá)式。例如,下面的語句可以返回整數(shù)或字符串,所以它返回一個(gè)變體類型:

  1. IF ( [measure] > 0, 1, "N/A" )
計(jì)算列不能返回變體類型,否則會(huì)收到提示:“不能使用生成變量數(shù)據(jù)類型的表達(dá)式定義計(jì)算列”。變體適用于 DAX 度量值,或更一般的說,DAX 表達(dá)式

 

DAX 運(yùn)算符

了解了運(yùn)算符在確定表達(dá)式類型的重要性之后,我們通過下表來看一下 DAX 中的運(yùn)算符列表。

運(yùn)算符列表

參數(shù)類型 符號(hào) 用法 舉例
小括號(hào) ( ) 改變計(jì)算優(yōu)先級(jí)和分組 (5+2)*3
四則運(yùn)算 + 相加 4 + 2
? 相減/邏輯否 5 ? 3
* 相乘 4 * 2
/ 相除 4 / 2
比較符號(hào) = 等于 [CountryRegion] = “USA”
<> 不等于 [CountryRegion] <> “USA”
> 大于 [Quantity] > 0
>= 大于或等于 [Quantity] >= 100
< 小于 [Quantity] < 0
<= 小于或等于 [Quantity] <= 100
== 嚴(yán)格相等 Product[Color] == BLANK()
文本連接 & 連接符 “Value is” & [Amount]
邏輯判斷 && 兩個(gè)布爾表達(dá)式之間的邏輯“與” [CountryRegion] = “USA” && [Quantity]>0
|| 兩個(gè)布爾表達(dá)式之間的邏輯“或” [CountryRegion] = “USA” || [Quantity] > 0
IN 元素包含在列表中 [CountryRegion] IN {“USA”, “Canada”}
NOT 否定判斷 NOT [Quantity] > 0

注意:IN 運(yùn)算符 2016 年 11 月發(fā)布,可能無法在 Excel 2016 以及更早的版本中使用,詳情參考IN 和 CONTAINSROW一文。

此外,邏輯運(yùn)算符也可以作為 DAX 函數(shù)使用,語法非常類似于 Excel。例如,你可以這樣寫:

  1. AND ( [CountryRegion] = "USA", [Quantity] > 0 )
  2. OR ( [CountryRegion] = "USA", [Quantity] > 0 )

它們分別與下面的寫法等價(jià):

  1. [CountryRegion] = "USA" && [Quantity] > 0
  2. [CountryRegion] = "USA" || [Quantity] > 0

當(dāng)你必須編寫復(fù)雜條件時(shí),使用函數(shù)代替運(yùn)算符進(jìn)行布爾邏輯運(yùn)算變得非常有用。事實(shí)上,當(dāng)需要格式化大量代碼時(shí),函數(shù)比運(yùn)算符更容易格式化和讀取。然而,函數(shù)的主要缺點(diǎn)是一次只能傳入兩個(gè)參數(shù)。如果需要計(jì)算兩個(gè)以上的條件,就需要嵌套函數(shù)。

嚴(yán)格相等運(yùn)算

當(dāng)兩個(gè)參數(shù)的值相同或都為空時(shí),操作符==返回 TRUE,此運(yùn)算符不執(zhí)行字符串和數(shù)字之間的任何隱式轉(zhuǎn)換,也就是說,將空值(BLANK)與任何其他值比較,比如 0、空字符串等,都將返回 FALSE。

只有當(dāng)兩個(gè)術(shù)語中至少有一個(gè)為空、空字符串或 0 時(shí),==運(yùn)算才與=不同。以下是使用“嚴(yán)格等于”運(yùn)算符的有效表達(dá)式:

  1. Product[Color] == "Red"
  2. Product[Color] == BLANK() -- Product[Color] 為 BLANK 時(shí)返回 TRUE, 為 "" 或其他值時(shí)返回 FALSE
  3. Product[Color] == "" -- Product[Color] 為空字符串時(shí)返回 TRUE, 為 BLANK 或其他值時(shí)返回 FALSE
  4. Sales[Quantity] == 1
  5. Sales[Quantity] == BLANK() -- Sales[Quantity] 為 BLANK 時(shí)返回 TRUE, 為 "" 或其他值時(shí)返回 FALSE
  6. Sales[Quantity] == 0 -- Sales[Quantity] 為 0 時(shí)返回 TRUE, 為 BLANK 或其他值時(shí)返回 FALSE
嚴(yán)格相等運(yùn)算(==)在 Power BI, Azure Analysis Services, and Analysis Services 2019 中可用,但不支持早期的 Analysis Services 和 Power Pivot for Excel.

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多