Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
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).