Sdílet prostřednictvím


ANY_VALUE (Transact-SQL)

platí pro:Warehouse v Microsoft Fabric

Funkce ANY_VALUE vrátí libovolnou (pokudNULL možnou) hodnotu ze skupiny řádků. Můžete ji použít jako agregační funkci i funkci okna (analýzy):

  • Agregační využití: Vrátí libovolnou hodnotu z celé skupiny.
  • Použití okna: Pracuje s definovaným rámečkem okna a vrací libovolnou hodnotu z celého okna.

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe agregační funkce:

ANY_VALUE ( [ ALL | DISTINCT ] expression )

Syntaxe analytické funkce:

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

Argumenty

ALL

Použije agregační funkci na všechny hodnoty. ALL je výchozí, pouze smysluplná možnost a je k dispozici pouze pro kompatibilitu ISO.

ODLIŠNÝ

DISTINCT není smysluplný s ANY_VALUEa je k dispozici pouze pro kompatibilitu ISO.

výraz

Hodnota, která se má vrátit. Každá z těchto hodnot se dá vrátit jako výsledek, ale NULL pokud je to možné, hodnoty se přeskočí.

Klauzule OVER

Partition_by_clause rozdělí sadu výsledků vytvořenou FROM klauzulí na oddíly a funkce se použije na každý oddíl.

Pokud tuto klauzuli nezadáte, bude funkce zacházet se všemi řádky sady výsledků dotazu jako s jednou skupinou.

order_by_clause určuje pořadí dat před použití funkce. Pokud zadáte partition_by_clause, určuje pořadí dat v oddílu. Order_by_clause není potřeba.

Další informace naleznete v tématu SELECT - OVER klauzule (Transact-SQL).

Návratové typy

Vrátí hodnotu stejného typu jako výraz.

Poznámky

ANY_VALUE je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce. Na rozdíl od FIRST_VALUE nebo LAST_VALUEANY_VALUE neposkytuje deterministické řazení. Je navržená pro případy, kdy pro logiku dotazu není přesná hodnota důležitá.

Funkce se pokusí vrátit nehodnotuNULL , pokud je to možné, a vrátí NULL hodnotu pouze v případě, že jsou NULLvšechny hodnoty .

Případ použití

Běžným případem ANY_VALUE použití je, že potřebujete do sady výsledků seskupené podle klíčového sloupce zahrnout sloupce bez klíče. Pokud například seskupíte řádky StoreIDpodle , můžete použít ANY_VALUE k vrácení hodnot pro sloupce, jako je název úložiště, adresa nebo jiné popisné atributy, aniž byste je přidali do GROUP BY klauzule nebo použili dražší funkce jako MAX, MIN, FIRST_VALUEnebo LAST_VALUE je zahrnout do projekce. Tento přístup zjednodušuje návrh dotazů, zlepšuje čitelnost a zvyšuje výkon, protože dotaz SQL nemusí provádět zbytečné seskupení v popisných sloupcích. Výsledkem je, že agregace zůstává stručnější, jednodušší a efektivnější.

Příklady

A. Načtení jakékoli hodnoty, která není null

Tento jednoduchý dotaz ukazuje, jak ANY_VALUE vrátit libovolnou hodnotu, která není null, ze sady hodnot:

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

Funkce ignoruje NULL hodnoty a vrací jednu z nehodnotovýchNULL hodnot (někdy 2, někdy 7) nedeterministickým způsobem.

B. Popisné sloupce projektu

Tento dotaz shrnuje celkový prodej v jednotlivých obchodech spojením , FactSalesDimStoreseskupováním StoreKeya načtením podrobností o úložišti klíčů pomocí 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 Použitím funkce můžete zahrnout neseskupovací sloupce (například StoreName, StoreDescription, , StoreStatus, StorePhone, StoreFax, ZipCodeAddressLine1a AddressLine2) bez jejich výpisu v klauzuliGROUP BY.

C. Převést hodnoty z řádků na sloupce

Tabulka FactSales obsahuje jeden řádek na položku řádku, kde OrderKey identifikuje pořadí. Pro každé pořadí, atributy, jako OrderDateje , DeliveryDateCustomerKey, a StoreKey jsou opakované napříč všemi řádky, které patří do stejného OrderKey. Naproti tomu ProductKey se liší podle řádkové položky s jedním produktem na každou LineNumberpoložku .

Následující dotaz přetáčí řádky FactSales tak, aby každý OrderKey z nich byl jeden řádek. Udržuje sdílené atributy na úrovni objednávky a vytvoří samostatný sloupec (ProductKey0, ProductKey1...) pro produkt přidružený k jednotlivým číslům řádku. Funkce ANY_VALUE se používá k výběru reprezentativní hodnoty z každé skupiny, zatímco podmíněné výrazy extrahují produkt pro každou konkrétní položku řádku.

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;

ANY_VALUE Použitím funkce se vyhnete umístění OrderDate, DeliveryDate, CustomerKey, a StoreKey v klauzuliGROUP BY. Funkce ANY_VALUE zjednodušuje dotaz a může zvýšit výkon, protože v klauzuli GROUP BY se používá pouze jeden sloupec (OrderKey). Vzor ANY_VALUE + CASE WHEN extrahuje odpovídající ProductKey pro každou položku řádku a vrátí je jako samostatné sloupce. V praxi tento model vytváří programový pivot kódů Product Key (alternativu k tradičnímu UNPIVOT operátoru).

D. Náhodná hodnota na oddíl se dvěma sloupci

Vytváříte sestavu podrobností na úrovni prodeje s denním klíčovým ukazatelem výkonu (KPI) pro každou prodejnu. V sestavě musíte vrátit stejný SalesOrderNumber oddíl podle (StoreKey, DateKey), kde neexistuje žádné obchodní pravidlo pro výběr konkrétního SalesOrderNumber. Není nutné vybírat nejstarší, nejnovější nebo nejvyšší pořadí na řádek v sestavě. Uživatelské rozhraní například vedle každého řádku zobrazuje "referenční objednávku pro store-day", aby analytik mohl rychle přejít na objednávku z páru (obchod, den).

Záměrem je vrátit jednu konzistenci SalesOrderNumber za (store, day).

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;

Pokud výraz nahradíte odkazem fs.SalesOrderNumber na ANY_VALUE(fs.SalesOrderNumber) sloupec, popisek se liší podle řádku. Ztratíte chování jednoho konzistentního popisku na jeden sloupec (store, day).