OFFSET

Gilt für:berechnete Spaltenberechnete TabellenMeasuresvisuelle Berechnungen

Gibt eine einzelne Zeile zurück, die entweder vor oder nach der aktuellen Zeile innerhalb derselben Tabelle positioniert ist, versetzt um einen vorgegebenen Wert (Offset). Falls die aktuelle Zeile nicht zu einer einzigen Zeile deduziert werden kann, werden möglicherweise mehrere Zeilen zurückgegeben.

Syntax

OFFSET ( <delta>[, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )

Parameter

Begriff Definition
delta Die Anzahl der Zeilen vor (negativer Wert) oder nach (positiver Wert) der aktuellen Zeile, aus der die Daten abgerufen werden sollen. Hierbei kann es sich um einen beliebigen DAX-Ausdruck handeln, der einen Skalarwert zurückgibt.
relation (Optional) Ein Tabellenausdruck, über den die Ausgabezeile zurückgegeben wird.
Wenn angegeben, müssen alle Spalten in <partitionBy> von dort oder aus einer zugehörigen Tabelle stammen.
Bei Auslassung:
– <orderBy> muss explizit angegeben werden.
– Alle <orderBy>- und <partitionBy>-Ausdrücke müssen vollqualifizierte Spaltennamen sein und aus einer einzigen Tabelle stammen.
– Für alle Spalten in <orderBy> und <partitionBy> wird standardmäßig ALLSELECTED() verwendet.
Achse (Optional) Eine Achse in der visuellen Form. Nur in visuellen Berechnungen verfügbar und ersetzt <relation>.
orderBy (Optional) Eine ORDERBY()-Klausel mit den Ausdrücken, die definieren, wie jede Partition sortiert wird.
Bei Auslassung:
– <relation> muss explizit angegeben werden.
– Standardmäßig erfolgt die Sortierung nach jeder Spalte in <relation>, die nicht bereits in <partitionBy> angegeben ist.
Leerzeichen (Optional) Eine Enumeration, die definiert, wie leere Werte beim Sortieren behandelt werden.
Dieser Parameter ist für die zukünftige Verwendung reserviert.
Derzeit ist der einzige unterstützte Wert DEFAULT, wobei das Verhalten für numerische Werte darin besteht, dass leere Werte zwischen 0 und negativen Werten angeordnet werden. Bei Zeichenfolgen werden leere Werte vor allen anderen Zeichenfolgen angeordnet, einschließlich leerer Zeichenfolgen.
partitionBy (Optional) Eine PARTITIONBY()-Klausel mit Spalten, die definieren, wie <relation> partitioniert wird.
Bei Auslassung wird <relation> als eine einzelne Partition behandelt.
matchBy (Optional) Eine MATCHBY()-Klausel, die die Spalten enthält, die definieren, wie Daten abgeglichen werden und die aktuelle Zeile identifiziert wird.
reset (Optional) Nur in visuellen Berechnungen verfügbar. Gibt an, ob die Berechnung zurückgesetzt wird und auf welcher Ebene der Spaltenhierarchie der visuellen Form. Akzeptierte Werte sind: NONE, LOWESTPARENT, HIGHESTPARENT oder ein Integer. Das Verhalten hängt vom Integervorzeichen ab:
 – Wenn null oder ausgelassen, wird die Berechnung nicht zurückgesetzt. Gleichbedeutend mit NONE.
 – Wenn der Integer positiv ist, identifiziert er die Spalte beginnend mit dem höchsten Wert, unabhängig vom Aggregationsintervall. HIGHESTPARENT entspricht 1.
 – Wenn der Integer negativ ist, identifiziert er die Spalte beginnend mit dem niedrigsten Wert, relativ zum aktuellen Aggregationsintervall. LOWESTPARENT entspricht -1.

Rückgabewert

Eine oder mehrere Zeilen aus <relation>.

Bemerkungen

Mit Ausnahme von Spalten, die von DAX-Tabellenfunktionen hinzugefügt werden, muss jede Spalte in <relation>, wenn <matchBy> nicht vorhanden ist, oder jede Spalte in <matchBy> und <partitionBy>, wenn <matchBy> vorhanden ist, über einen entsprechenden äußeren Wert verfügen, um die aktuelle Zeile zu definieren, für die die Aktion ausgeführt werden soll, mit folgendem Verhalten:

  • Wenn es genau eine entsprechende äußere Spalte gibt, wird deren Wert verwendet.
  • Wenn keine entsprechende äußere Spalte vorhanden ist, lautet das Vorgehen wie folgt:
    • OFFSET ermittelt zunächst alle Spalten, die nicht über eine entsprechende äußere Spalte verfügen.
    • Für jede Kombination vorhandener Werte für diese Spalten im übergeordneten Kontext von OFFSET wird OFFSET ausgewertet, und es wird eine Zeile zurückgegeben.
    • Die endgültige Ausgabe von OFFSET ist eine Vereinigung dieser Zeilen.
  • Wenn es mehr als eine entsprechende äußere Spalte gibt, wird ein Fehler zurückgegeben.

Wenn alle Spalten von <relation> von DAX-Tabellenfunktionen hinzugefügt wurden, wird ein Fehler zurückgegeben.

Wenn <matchBy> vorhanden ist, versucht OFFSET, die Spalten <matchBy> und <partitionBy> zu verwenden, um die Zeile zu identifizieren.
Wenn <matchBy> nicht vorhanden ist, und die in <orderBy> und <partitionBy> angegebenen Spalten nicht jede Zeile in <relation> eindeutig identifizieren können, gilt Folgendes:

  • OFFSET versucht, die kleinstmögliche Anzahl zusätzlicher Spalten zu finden, die zur eindeutigen Identifizierung jeder Zeile erforderlich sind.
  • Wenn solche Spalten gefunden werden, fügt OFFSET diese neuen Spalten automatisch an <orderBy> an, und jede Partition wird anhand dieses neuen Satzes von orderBy-Spalten sortiert.
  • Wenn keine solchen Spalten gefunden werden, wird ein Fehler zurückgegeben.

In den folgenden Fällen wird eine leere Tabelle zurückgegeben:

  • In <relation> ist kein entsprechender äußerer Wert einer orderBy- oder partitionBy-Spalte vorhanden.
  • Der <delta>-Wert bewirkt eine Verschiebung in eine Zeile, die in der Partition nicht vorhanden ist.

Wenn OFFSET innerhalb einer berechneten Spalte verwendet wird, die in derselben Tabelle wie <relation> definiert ist, und <orderBy> nicht angegeben ist, wird ein Fehler zurückgegeben.

<reset> kann nur in visuellen Berechnungen verwendet werden und kann nicht in Kombination mit <orderBy> oder <partitionBy> verwendet werden. Wenn <reset> vorhanden ist, kann <axis> angegeben werden, aber <relation> kann nicht angegeben werden.

Beispiel 1 – berechnete Spalte

Die folgende DAX-Abfrage:

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]
    )
)

Gibt eine Tabelle zurück, die den Gesamtumsatz für jede Produktkategorie und jedes Kalenderjahr sowie den Gesamtumsatz für diese Kategorie im Vorjahr zusammenfasst.

Beispiel 2 – Measure

Die folgende DAX-Abfrage:

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]
)

Verwendet OFFSET() in einer Messung, um eine Tabelle zurückzugeben, die den Gesamtumsatz für jedes Kalenderjahr und den Gesamtumsatz für das Vorjahr zusammenfasst.

Beispiel 3 – berechnete Spalte

Die folgende DAX-Abfrage:

EVALUATE
ADDCOLUMNS (
    FactInternetSales,
    "Previous Sales Amount",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                FactInternetSales,
                ORDERBY ( FactInternetSales[SalesAmount], DESC ),
                PARTITIONBY ( FactInternetSales[ProductKey] ),
                MATCHBY( FactInternetSales[SalesOrderNumber], FactInternetSales[SalesOrderLineNumber] )
            ),
            FactInternetSales[SalesAmount]
        )
)

Gibt die FactInternetSales-Tabelle mit dem Hinzufügen einer Spalte zurück, die für jeden Verkauf den Betrag des vorherigen Verkaufs desselben Produkts in absteigender Reihenfolge des Verkaufsbetrags angibt, wobei der aktuelle Verkauf durch seine SalesOrderNumber und SalesOrderLineNumber identifiziert wird. Ohne MATCHBY würde die Abfrage einen Fehler zurückgeben, da in der FactInternetSales-Tabelle keine Schlüsselspalten vorhanden sind.

Beispiel 4 – visuelle Berechnung

Die folgende DAX-Abfrage für die visuelle Berechnung:

SalesRelativeToPreviousMonth = [SalesAmount] - CALCULATE(SUM([SalesAmount]), OFFSET(-1, ROWS, HIGHESTPARENT))

Gibt die Differenz des Gesamtumsatzes zwischen jedem Monat und des vorherigen Monats innerhalb desselben Jahres zurück.

Der folgende Screenshot zeigt die visuelle Matrix und den Ausdruck der visuellen Berechnung:

Visuelle DAX-Berechnung

INDEX
ORDERBY
PARTITIONBY
MATCHBY
WINDOW
RANK
ROWNUMBER