Freigeben über


ANY_VALUE (Transact-SQL)

Gilt für:Warehouse in Microsoft Fabric

Die ANY_VALUE Funktion gibt einen beliebigen (fallsNULL möglich) Wert aus einer Gruppe von Zeilen zurück. Sie können sie sowohl als Aggregatfunktion als auch als Fensterfunktion (Analysefunktion) verwenden:

  • Aggregierte Verwendung: Gibt einen beliebigen Wert aus der gesamten Gruppe zurück.
  • Fensterverwendung: Betreibt einen definierten Fensterrahmen und gibt einen beliebigen Wert aus dem gesamten Fenster zurück.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax der Aggregationsfunktion:

ANY_VALUE ( [ ALL | DISTINCT ] expression )

Analysefunktionssyntax:

ANY_VALUE ( [ ALL | DISTINCT ] expression) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )

Argumente

ALL

Wendet die Aggregatfunktion auf alle Werte an. ALL ist die Standardoption, nur sinnvolle Option und steht nur für ISO-Kompatibilität zur Verfügung.

EINDEUTIG

DISTINCT ist nicht sinnvoll mit ANY_VALUE, und ist nur für ISO-Kompatibilität verfügbar.

expression

Der zurückzugebende Wert. Jeder der Werte kann als Ergebnis zurückgegeben werden, die NULL Werte werden jedoch nach Möglichkeit übersprungen.

OVER-Klausel

Die partition_by_clause dividiert das von der FROM Klausel erzeugte Resultset in Partitionen, und die Funktion wird auf jede Partition angewendet.

Wenn Sie diese Klausel nicht angeben, behandelt die Funktion alle Zeilen des Abfrageergebnissatzes als einzelne Gruppe.

order_by_clause bestimmt die Reihenfolge der Daten, bevor die Funktion angewendet wird. Wenn Sie partition_by_clause angeben, bestimmt sie die Reihenfolge der Daten in der Partition. Die order_by_clause ist nicht erforderlich.

Weitere Informationen finden Sie unter SELECT - OVER-Klausel (Transact-SQL).

Rückgabetypen

Gibt einen Wert vom gleichen Typ wie ausdruck zurück.

Bemerkungen

ANY_VALUE ist nicht deterministisch. Weitere Informationen finden Sie unter Deterministische und nicht deterministische Funktionen. Im Gegensatz FIRST_VALUE oder LAST_VALUE, ANY_VALUE bietet keine deterministische Sortierung. Es wurde für Fälle entwickelt, in denen der genaue Wert für die Abfragelogik nicht wichtig ist.

Die Funktion versucht, nach Möglichkeit einen Wert zurückzugebenNULL , und gibt nur dann einen Wert zurück NULL , wenn alle Werte vorhanden sind NULL.

Anwendungsfall

Ein gängiger Anwendungsfall ANY_VALUE ist, wenn Sie nicht schlüsselfreie Spalten in ein Resultset einschließen müssen, das nach einer Schlüsselspalte gruppiert ist. Wenn Sie z. B. Zeilen nach StoreIDgruppieren, können ANY_VALUE Sie Werte für Spalten wie Speichername, Adresse oder andere beschreibende Attribute zurückgeben, ohne sie der GROUP BY Klausel hinzuzufügen oder teurere Funktionen wie MAX, MIN, , FIRST_VALUEoder LAST_VALUE um sie in die Projektion einzuschließen. Dieser Ansatz vereinfacht den Abfrageentwurf, verbessert die Lesbarkeit und verbessert die Leistung, da sql-Abfrage keine unnötige Gruppierung der beschreibenden Spalten durchführen muss. Daher bleibt Ihre Aggregation präzise, einfacher zu verwalten und effizienter.

Beispiele

A. Abrufen eines beliebigen Werts ohne NULL

Diese einfache Abfrage veranschaulicht, wie ANY_VALUE ein beliebiger Nicht-NULL-Wert aus einer Gruppe von Werten zurückgegeben werden kann:

SELECT ANY_VALUE(v)
FROM (VALUES (NULL), (NULL), (NULL), (NULL), (2), (NULL), (NULL), (7), (NULL), (NULL)) AS t(v);

Die Funktion ignoriert NULL Werte und gibt einen der Nicht-WerteNULL (manchmal 2, manchmal 7) auf unbestimmte Weise zurück.

B. Beschreibende Projektspalten

Diese Abfrage fasst den Gesamtumsatz pro Store zusammen, indem FactSales sie mit DimStore, gruppieren StoreKeyund Schlüsselspeicherdetails mithilfe ANY_VALUEvon . abrufen.

USE ContosoDW;  
GO  
SELECT
    fs.StoreKey,
    ANY_VALUE(ds.StoreName)        AS StoreName,
    ANY_VALUE(ds.StoreDescription) AS StoreDescription,
    ANY_VALUE(ds.Status)           AS StoreStatus,
    ANY_VALUE(ds.Phone)            AS StorePhone,
    ANY_VALUE(ds.Fax)              AS StoreFax,
    ANY_VALUE(ds.ZipCode)          AS ZipCode,
    ANY_VALUE(ds.AddressLine1)     AS AddressLine1,
    ANY_VALUE(ds.AddressLine2)     AS AddressLine2,
    SUM(fs.UnitPrice * fs.SalesQuantity) AS SalesAmount
FROM dbo.FactSales AS fs
LEFT JOIN dbo.DimStore AS ds
    ON ds.StoreKey = fs.StoreKey
GROUP BY
    fs.StoreKey;  

Durch Anwenden der ANY_VALUE Funktion können Sie nicht gruppierende Spalten (z StoreName. B. , , StoreDescription, StoreStatus, StorePhone, StoreFax, ZipCode, AddressLine1und AddressLine2) einschließen, ohne sie in der GROUP BY Klausel aufzulisten.

C. Aufheben des Pivotierens von Werten aus Zeilen in Spalten

Die FactSales Tabelle enthält eine Zeile pro Position, wobei OrderKey die Bestellung identifiziert wird. Für jede Reihenfolge werden Attribute wie , , , und StoreKey werden in allen Zeilen wiederholt, die zu demselben OrderKeygehören . CustomerKeyDeliveryDateOrderDate Im Gegensatz dazu ProductKey variiert die Position je Artikel mit einem Produkt pro LineNumber.

Die folgende Abfrage pivotiert die FactSales Zeilen so, dass jede OrderKey eine einzelne Zeile ist. Sie behält die Attribute auf freigegebener Reihenfolgeebene bei und erstellt eine separate Spalte (ProductKey0, ProductKey1, ...) für das Produkt, das jeder Zeilennummer zugeordnet ist. Die ANY_VALUE Funktion wird verwendet, um einen repräsentativen Wert aus jeder Gruppe auszuwählen, während die bedingten Ausdrücke das Produkt für jede bestimmte Position extrahieren.

SELECT
    OrderKey,
    -- Projecting groups that are same within the group.
    ANY_VALUE(OrderDate)      AS OrderDate,
    ANY_VALUE(DeliveryDate)   AS DeliveryDate,
    ANY_VALUE(CustomerKey)    AS CustomerKey,
    ANY_VALUE(StoreKey)       AS StoreKey,
    -- Unpivoted values returned as multiple columns per row
    ANY_VALUE(IIF(LineNumber = 0, ProductKey, NULL)) AS ProductKey0,
    ANY_VALUE(IIF(LineNumber = 1, ProductKey, NULL)) AS ProductKey1,
    ANY_VALUE(IIF(LineNumber = 2, ProductKey, NULL)) AS ProductKey2,
    ANY_VALUE(IIF(LineNumber = 3, ProductKey, NULL)) AS ProductKey3,
    ANY_VALUE(IIF(LineNumber = 4, ProductKey, NULL)) AS ProductKey4,
    ANY_VALUE(IIF(LineNumber = 5, ProductKey, NULL)) AS ProductKey5,
    ANY_VALUE(IIF(LineNumber = 6, ProductKey, NULL)) AS ProductKey6
FROM dbo.FactSales
GROUP BY
    OrderKey;

Wenn Sie die ANY_VALUE Funktion verwenden, vermeiden Sie das Platzieren OrderDatevon , , DeliveryDate, CustomerKeyund StoreKey in der GROUP BY Klausel. Die ANY_VALUE Funktion vereinfacht die Abfrage und kann die Leistung verbessern, da nur eine einzelne Spalte (OrderKey) in der GROUP BY Klausel verwendet wird. Das ANY_VALUE + CASE WHEN Muster extrahiert die entsprechenden ProductKey Elemente und gibt sie als separate Spalten zurück. In der Praxis erzeugt dieses Muster einen programmgesteuerten Pivot der Product Keys (eine Alternative zum herkömmlichen UNPIVOT Operator).

D. Zufälliger Wert pro zwei Spaltenpartition

Sie erstellen einen Detailbericht auf Vertriebsebene mit einem täglichen Key Performance Indicator (KPI) pro Store. Im Bericht müssen Sie dieselbe SalesOrderNumber Partition pro (StoreKey, ) zurückgeben, DateKeyauf der keine Geschäftsregel vorhanden ist, um eine bestimmte SalesOrderNumber. Es ist nicht erforderlich, früheste, neueste oder größte Reihenfolge pro Zeile im Bericht zu wählen. Die Benutzeroberfläche zeigt z. B. neben jeder Zeile "eine Referenzreihenfolge für den Store-Tag" an, damit ein Analyst schnell zu einer Bestellung aus dem Paar (Store, Tag) springen kann.

Die Absicht besteht darin, ein einheitliches SalesOrderNumber pro (Speicher, Tag) zurückzugeben.

USE ContosoDW;
GO
SELECT
    fs.DateKey,
    fs.StoreKey,

    -- Window KPI: total sales per Store-Day (keeps row-level output)
    SUM(fs.UnitPrice * fs.SalesQuantity)
      OVER (PARTITION BY fs.StoreKey, dd.DateKey) AS DailySales,

    -- Partition label with no preferred ordering: any one order from that Store-Day
    ANY_VALUE(fs.SalesOrderNumber)
      OVER (PARTITION BY fs.StoreKey, dd.DateKey) AS SampleOrderNumber

FROM dbo.FactSales AS fs;

Wenn Sie den ANY_VALUE(fs.SalesOrderNumber) Ausdruck durch fs.SalesOrderNumber Spaltenverweis ersetzen, variiert die Beschriftung zeilenweise. Sie verlieren das Verhalten "eine einheitliche Bezeichnung pro (Speicher, Tag)".