OFFSET
根據指定的位移,傳回位於相同資料表內目前資料列之前或之後的單一資料列。 如果目前的資料列無法推算為單一資料列,可能會傳回多個資料列。
語法
OFFSET ( <delta>[, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )
參數
詞彙 | 定義 |
---|---|
delta | 要從中取得資料之目前資料列之前 (負值) 或之後的資料列數。 其可為傳回純量值的任何 DAX 運算式。 |
relation | (選擇性) 傳回輸出資料列的來源資料表運算式。 如果指定,<partitionBy> 中的所有資料行都必須以其或相關資料表做為來源。 如果省略:必須明確指定 - <orderBy>。 - 所有 <orderBy> 和 <partitionBy> 運算式都必須是完整資料行名稱,且來自單一資料表。 - 預設為 <orderBy> 和 <partitionBy> 中所有資料行的 ALLSELECTED()。 |
軸 | (選擇性)視覺圖形中的軸。 僅適用於視覺計算,並取代 <關聯>。 |
orderBy | (選擇性) ORDERBY() 子句,其中包含定義每個分割區排序方式的運算式。 如果省略:必須明確指定 - <relation>。 - 預設會依 <relation> 中尚未在 <partitionBy> 中指定的每個資料行排序。 |
blanks | (選擇性) 列舉,會定義排序時如何處理空白值。 這個參數會保留供日後使用。 目前,唯一支援的值是 DEFAULT,其中數值的行為是空白值,會在零與負值之間排序。 字串的行為是空白值,會在所有字串之前排序,包括空字串。 |
partitionBy | (選擇性) PARTITIONBY() 子句包含定義如何分割 <relation> 的資料行。 如果省略,<relation> 會視為單一分割區。 |
matchBy | (選擇性) MATCHBY() 子句,其中包含定義如何比對資料及識別目前資料列的資料行。 |
reset | (選擇性)僅適用於視覺計算。 指出計算是否重設,以及視覺圖形數據行階層的哪個層級。 接受的值包括:NONE、LOWESTPARENT、HIGHESTPARENT 或整數。 行為取決於整數符號: - 如果零或省略,則計算不會重設。 相當於 NONE。 - 如果為正數,整數會識別從最高、與粒紋無關的數據行。 HIGHESTPARENT 相當於 1。 - 如果為負數,整數會識別從最低開始的數據行,相對於目前的粒紋。 LOWESTPARENT 相當於 -1。 |
傳回值
<relation> 的一或多個資料列。
備註
除了 DAX 資料表函式新增的資料行,當 <matchBy> 不存在時,為 <relation> 中的每個資料行,或是當 <matchBy> 存在時,為 <matchBy> 和 <partitionBy> 中的每個資料行,必須有對應的外部值,才能協助定義要操作的目前資料列,行為如下:
- 如果只有一個對應的外部資料行,則會使用其值。
- 如果沒有對應的外部資料行,則:
- OFFSET 會先將所有資料行判斷為沒有對應的外部資料行。
- 針對 OFFSET 的父內容中這些資料行現有值的每個組合,都會評估 OFFSET,並傳回資料列。
- OFFSET 最終輸出是這些資料列的聯集。
- 如果有多個對應的外部資料行,則會傳回錯誤。
如果 DAX 資料表函式已新增所有 <relation> 的資料行,則會傳回錯誤。
如果 <matchBy> 存在,則 OFFSET 會嘗試使用 <matchBy> 和 <partitionBy> 資料行來識別資料列。
如果 <matchBy> 不存在,且 <orderBy> 和 <partitionBy> 中所指定的資料行無法唯一識別 <relation> 中的每個資料列,則:
- OFFSET 會嘗試尋找唯一識別每個資料列所需的最少額外資料行數目。
- 如果能夠找到這類資料行,則 OFFSET 會自動將這些新資料行附加至 <orderBy>,且每個分割區都會使用這組新的 OrderBy 資料行集來排序。
- 如果找不到這類資料行,就會傳回錯誤。
如果發生下列情況,就會傳回空白的資料表:
- orderBy 或 partitionBy 資料行的對應外部值不存在於 <relation> 內。
- <delta> 值會導致切換到資料分割內不存在的資料列。
如果在與 <relation> 相同資料表上定義的計算資料行內使用 OFFSET,並且省略 <orderBy>,則會傳回錯誤。
<reset> 只能用於視覺計算中,而且不能與 <orderBy> 或 <partitionBy> 搭配使用。 如果 <重設> 存在, <可以指定座標軸> ,但 <無法指定關聯> 。
範例 1 - 計算結果列
下列 DAX 查詢:
DEFINE
VAR vRelation = SUMMARIZECOLUMNS (
DimProductCategory[EnglishProductCategoryName],
DimDate[CalendarYear],
"CurrentYearSales", SUM(FactInternetSales[SalesAmount])
)
EVALUATE
ADDCOLUMNS (
vRelation,
"PreviousYearSales",
SELECTCOLUMNS(
OFFSET (
-1,
vRelation,
ORDERBY([CalendarYear]),
PARTITIONBY([EnglishProductCategoryName])
),
[CurrentYearSales]
)
)
傳回資料表,摘要說明每個產品類別和日曆年度的總銷售額,以及上一年該類別的總銷售額。
範例 2 - 量值
下列 DAX 查詢:
DEFINE
MEASURE DimProduct[CurrentYearSales] = SUM(FactInternetSales[SalesAmount])
MEASURE DimProduct[PreviousYearSales] = CALCULATE(SUM(FactInternetSales[SalesAmount]), OFFSET(-1, , ORDERBY(DimDate[CalendarYear])))
EVALUATE
SUMMARIZECOLUMNS (
DimDate[CalendarYear],
"CurrentYearSales", DimProduct[CurrentYearSales],
"PreviousYearSales", DimProduct[PreviousYearSales]
)
在量值中使用 OFFSET() 傳回資料表,以摘要列出每個日曆年度的總銷售額,以及前一年的總銷售額。
範例 3 - 計算結果列
下列 DAX 查詢:
EVALUATE
ADDCOLUMNS (
FactInternetSales,
"Previous Sales Amount",
SELECTCOLUMNS (
OFFSET (
-1,
FactInternetSales,
ORDERBY ( FactInternetSales[SalesAmount], DESC ),
PARTITIONBY ( FactInternetSales[ProductKey] ),
MATCHBY( FactInternetSales[SalesOrderNumber], FactInternetSales[SalesOrderLineNumber] )
),
FactInternetSales[SalesAmount]
)
)
傳回 FactInternetSales 資料表,並新增一個資料行,指出每一筆銷售的同一產品的之前銷售額按銷售額遞減排列,目前的銷售由其 SalesOrderNumber 和 SalesOrderLineNumber 識別。 如果沒有 MATCHBY,查詢會傳回錯誤,因為 FactInternetSales 資料表中沒有索引鍵資料行。
範例 4 - 視覺計算
下列視覺計算 DAX 查詢:
SalesRelativeToPreviousMonth = [SalesAmount] - CALCULATE(SUM([SalesAmount]), OFFSET(-1, ROWS, HIGHESTPARENT))
傳回每個月與同一年內前一個銷售額的總銷售額差異。
下列螢幕快照顯示視覺化矩陣和視覺計算表示式: