Udostępnij za pośrednictwem


ANY_VALUE (Transact-SQL)

Dotyczy:Warehouse w usłudze Microsoft Fabric

Funkcja ANY_VALUE zwraca dowolną (niemożliwąNULL ) wartość z grupy wierszy. Można go użyć zarówno jako funkcji agregującej, jak i funkcji okna (analitycznego):

  • Użycie agregacji: zwraca dowolną wartość z całej grupy.
  • Użycie okna: działa na zdefiniowanej ramce okna i zwraca dowolną wartość z całego okna.

Transact-SQL konwencje składni

Składnia

Składnia funkcji agregacji:

ANY_VALUE ( [ ALL | DISTINCT ] expression )

Składnia funkcji analitycznej:

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

Arguments

ALL

Stosuje funkcję agregacji do wszystkich wartości. ALL jest domyślną, tylko zrozumiałą opcją i jest dostępna tylko dla zgodności ISO.

ODMIENNY

DISTINCT nie ma znaczenia w przypadku elementu i jest dostępny tylko w celu zapewnienia zgodności ze standardem ANY_VALUEISO.

wyrażenie

Wartość, która ma zostać zwrócona. W wyniku można zwrócić dowolną z wartości, ale NULL wartości są pomijane, jeśli to możliwe.

Klauzula OVER

Partition_by_clause dzieli zestaw wyników wygenerowany przez klauzulę FROM na partycje, a funkcja jest stosowana do każdej partycji.

Jeśli nie określisz tej klauzuli, funkcja traktuje wszystkie wiersze zestawu wyników zapytania jako pojedynczą grupę.

order_by_clause określa kolejność danych przed zastosowaniem funkcji. Jeśli określisz partition_by_clause, określa kolejność danych w partycji. Order_by_clause nie jest wymagany.

Aby uzyskać więcej informacji, zobacz SELECT - OVER clause (Transact-SQL).

Typy zwracane

Zwraca wartość tego samego typu co wyrażenie.

Uwagi

ANY_VALUE nie jest nieokreślony. Aby uzyskać więcej informacji, zobacz funkcje deterministyczne i niedeterministyczne. W przeciwieństwie do FIRST_VALUE elementu lub LAST_VALUE, ANY_VALUE nie zapewnia określania kolejności deterministycznej. Jest ona przeznaczona dla przypadków, w których dokładna wartość nie jest ważna dla logiki zapytania.

Funkcja próbuje zwrócić wartość inną niżNULL wartość, jeśli jest to możliwe, i zwraca NULL wartość tylko wtedy, gdy wszystkie wartości to NULL.

Przypadek użycia

Typowym przypadkiem ANY_VALUE użycia jest uwzględnienie kolumn innych niżkey w zestawie wyników pogrupowanych według kolumny klucza. Jeśli na przykład grupujesz wiersze według StoreID, możesz użyć ANY_VALUE polecenia , aby zwracać wartości dla kolumn, takich jak nazwa sklepu, adres lub inne atrybuty opisowe bez dodawania ich do GROUP BY klauzuli lub używania droższych funkcji, takich jak MAX, MIN, FIRST_VALUElub LAST_VALUE w celu uwzględnienia ich w projekcji. Takie podejście upraszcza projektowanie zapytań, zwiększa czytelność i zwiększa wydajność, ponieważ zapytanie SQL nie musi wykonywać niepotrzebnych grupowania w kolumnach opisowych. W związku z tym agregacja pozostaje zwięzła, łatwiejsza do utrzymania i wydajniejsza.

Examples

Odp. Pobieranie dowolnej wartości innej niż NULL

To proste zapytanie pokazuje, jak ANY_VALUE można zwrócić dowolną wartość inną niż NULL z zestawu wartości:

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

Funkcja ignoruje NULL wartości i zwraca jedną z wartości innychNULL niż (czasami 2, czasami 7) w sposób nieokreślony.

B. Kolumny opisowe projektu

To zapytanie podsumowuje łączną sprzedaż na sklep, łącząc się FactSales z elementem DimStore, grupowaniem w witrynie StoreKeyi pobieraniem szczegółów magazynu kluczy przy użyciu polecenia ANY_VALUE.

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;  

ANY_VALUE Stosując funkcję, można dołączać kolumny niegrupujące (takie jak StoreName, , StoreFaxStoreStatusZipCodeStoreDescriptionStorePhone, AddressLine1, i AddressLine2) bez wyświetlania ich w klauzuli .GROUP BY

C. Anulowanie przestawiania wartości z wierszy do kolumn

Tabela FactSales zawiera jeden wiersz na element wiersza, w którym OrderKey identyfikuje zamówienie. Dla każdego zamówienia atrybuty, takie jak OrderDate, DeliveryDate, CustomerKeyi StoreKey są powtarzane we wszystkich wierszach należących do tego samego OrderKeyelementu . Natomiast różni się w ProductKey zależności od elementu wiersza, z jednym produktem na LineNumber.

Poniższe zapytanie przewrotnie wiersze FactSales tak, aby każdy z nich OrderKey był pojedynczym wierszem. Przechowuje udostępnione atrybuty na poziomie zamówienia i tworzy oddzielną kolumnę (ProductKey0, ProductKey1, ...) dla produktu skojarzonego z każdym numerem wiersza. Funkcja ANY_VALUE służy do wybierania reprezentatywnej wartości z każdej grupy, podczas gdy wyrażenia warunkowe wyodrębniają produkt dla każdego określonego elementu wiersza.

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;

Korzystając z funkcji, należy unikać umieszczania ANY_VALUEOrderDateklauzuli , DeliveryDate, CustomerKeyi StoreKey w klauzuli GROUP BY . Funkcja ANY_VALUE upraszcza zapytanie i może zwiększyć wydajność, ponieważ w klauzuli jest używana tylko jedna kolumna (OrderKey).GROUP BY Wzorzec ANY_VALUE + CASE WHEN wyodrębnia odpowiedni ProductKey element wiersza i zwraca je jako oddzielne kolumny. W praktyce ten wzorzec tworzy programowy element przestawny kluczy produktu (alternatywę dla tradycyjnego UNPIVOT operatora).

D. Losowa wartość na dwie kolumny partycji

Tworzysz raport szczegółów na poziomie sprzedaży z dziennym kluczowym wskaźnikiem wydajności (KPI) dla każdego sklepu. W raporcie musisz zwrócić tę samą SalesOrderNumber partycję na partycję (StoreKey, DateKey), w której nie istnieje żadna reguła biznesowa, aby wybrać określony SalesOrderNumberelement . Nie ma potrzeby wybierania najwcześniejszej, najnowszej lub największej kolejności na wiersz w raporcie. Na przykład interfejs użytkownika wyświetla "kolejność referencyjną dnia sklepu" obok każdego wiersza, dzięki czemu analityk może szybko przejść do zamówienia z pary (sklep, dzień).

Intencją jest zwrócenie jednej spójnej SalesOrderNumber na (sklep, dzień).

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;

Jeśli zastąpisz ANY_VALUE(fs.SalesOrderNumber) wyrażenie odwołaniem fs.SalesOrderNumber do kolumny, etykieta zmienia się w wierszu po wierszu; utracisz zachowanie "jedna spójna etykieta na (magazyn, dzień)."