Megosztás a következőn keresztül:


ANY_VALUE (Transact-SQL)

A következőkre vonatkozik:Warehouse a Microsoft Fabric

A ANY_VALUE függvény bármilyen (NULL ha lehetséges) értéket ad vissza egy sorcsoportból. Összesítő függvényként és ablakfüggvényként (analitikus) is használható:

  • Összesítési használat: Tetszőleges értéket ad vissza a teljes csoportból.
  • Ablakhasználat: Egy megadott ablakkereten keresztül működik, és tetszőleges értéket ad vissza a teljes ablakból.

Transact-SQL szintaxis konvenciók

Szemantika

Aggregációs függvény szintaxisa:

ANY_VALUE ( [ ALL | DISTINCT ] expression )

Elemzési függvény szintaxisa:

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

Arguments

ALL

Az összesítő függvény alkalmazása az összes értékre. Az ALL az alapértelmezett, csak értelmes beállítás, és csak ISO-kompatibilitás esetén érhető el.

KÜLÖNBÖZŐ

DISTINCT nem értelmezhető, ANY_VALUEés csak ISO-kompatibilitás esetén érhető el.

kifejezés

A visszaadandó érték. Az értékek bármelyike visszaadható eredményként, de ha lehetséges, kihagyja az NULL értékeket.

OVER záradék

A partition_by_clause a záradék által FROM létrehozott eredményhalmazt partíciókra osztja, és a függvényt minden partícióra alkalmazza a rendszer.

Ha nem adja meg ezt a záradékot, a függvény a lekérdezés eredményhalmazának összes sorát egyetlen csoportként kezeli.

A order_by_clause határozza meg az adatok sorrendjét a függvény alkalmazása előtt. Ha partition_by_clause ad meg, az határozza meg a partícióban lévő adatok sorrendjét. A order_by_clause nincs szükség.

További információ: SELECT – OVER záradék (Transact-SQL).

Visszatérési típusok

A kifejezéssel azonos típusú értéket ad vissza.

Megjegyzések

ANY_VALUE nemdeterminista. További információ: Determinisztikus és nem determinisztikus függvények. Ellentétben FIRST_VALUE vagy LAST_VALUE, ANY_VALUE nem biztosít determinisztikus rendezés. Olyan esetekre tervezték, amikor a pontos érték nem fontos a lekérdezési logika szempontjából.

A függvény lehetőség szerint nem értéket próbál visszaadniNULL, és csak akkor ad vissza NULL értéket, ha az összes érték .NULL

Felhasználási eset

Gyakori használati eset ANY_VALUE , ha kulcsoszlopok szerint csoportosított eredményhalmazba nem kulcsoszlopokat kell belefoglalnia. Ha például sorok szerint csoportosítja a sorokat StoreID, akkor az olyan oszlopok értékeit is visszaadhatja ANY_VALUE , mint például a tároló neve, a cím vagy más leíró attribútumok anélkül, hogy hozzáadja őket a GROUP BY záradékhoz, vagy drágább függvényeket használ, például MAXa , MIN, FIRST_VALUEvagy LAST_VALUE hogy belefoglalja őket a vetítésbe. Ez a megközelítés leegyszerűsíti a lekérdezések tervezését, javítja az olvashatóságot és javítja a teljesítményt, mivel az SQL-lekérdezésnek nem kell szükségtelen csoportosítást végeznie a leíró oszlopokon. Ennek eredményeképpen az összesítés tömör, könnyebben karbantartható és hatékonyabb marad.

Examples

A. Nem NULL értékű értékek lekérése

Ez az egyszerű lekérdezés bemutatja, hogyan ANY_VALUE adhat vissza tetszőleges nem NULL értéket egy értékkészletből:

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

A függvény figyelmen kívül hagyja NULL az értékeket, és nemdeterminista módon adja vissza az egyik nem értéketNULL (néha 2, néha 7).

B. Projekt leíró oszlopai

Ez a lekérdezés az üzletenkénti összes értékesítést összegzi a következőkkel való csatlakozássalFactSales, csoportosítással DimStoreStoreKeyés a kulcstár részleteinek beolvasásávalANY_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;  

A függvény alkalmazásával ANY_VALUE nem csoportosító oszlopokat (például StoreName, , StoreDescription, StoreStatus, StorePhoneStoreFax, ZipCode, AddressLine1és AddressLine2) is felvehet anélkül, hogy felsorolja őket a GROUP BY záradékban.

C. Értékek leválasztása sorokról oszlopokra

A FactSales táblázat sorelemenként egy sort tartalmaz, ahol OrderKey azonosítja a sorrendet. Az egyes rendelések esetében az olyan attribútumok, mint OrderDatea , DeliveryDateCustomerKey, és StoreKey ismétlődnek az azonos OrderKeysorhoz tartozó összes sorban. Ezzel szemben ProductKey sortételenként változik, és minden termékhez LineNumbertartozik egy termék.

Az alábbi lekérdezés a sorokat úgy forgatja FactSales el, hogy mindegyik OrderKey egyetlen sor legyen. Megtartja a megosztott rendelésszintű attribútumokat, és külön oszlopot (ProductKey0, ProductKey1, ...) hoz létre az egyes sorok számához társított termékhez. A ANY_VALUE függvény az egyes csoportok reprezentatív értékének kiválasztására szolgál, míg a feltételes kifejezések minden egyes sorelemhez kinyerik a terméket.

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;

A függvény használatával elkerülheti, ANY_VALUE hogy a záradékban CustomerKeyDeliveryDateStoreKey és a GROUP BY záradékban szerepeljenOrderDate. A ANY_VALUE függvény leegyszerűsíti a lekérdezést, és javíthatja a teljesítményt, mivel a záradékban GROUP BY csak egyetlen oszlop (OrderKey) szerepel. A ANY_VALUE + CASE WHEN minta kinyeri az egyes sorelemeknek megfelelőt ProductKey , és külön oszlopként adja vissza őket. A gyakorlatban ez a minta a termékkulcsok programozott kimutatását hozza létre (a hagyományos UNPIVOT operátor alternatívája).

D. Véletlenszerű érték két oszloppartíciónként

Üzletenként napi fő teljesítménymutatóval (KPI) készít értékesítési szintű részletes jelentést. A jelentésben ugyanazt SalesOrderNumber a (StoreKey, ) partíciót kell visszaadnia, DateKeyahol nincs üzleti szabály egy adott SalesOrderNumberelem kiválasztásához. Nincs szükség a legkorábbi, legújabb vagy legnagyobb sorrend kiválasztására soronként a jelentésben. A felhasználói felületen például az egyes sorok mellett látható a "referenciarendelés az áruház napjára" felirat, így az elemzők gyorsan átugorhatnak egy megrendelésre a (store, day) párból.

A szándék az, hogy egy konzisztenst SalesOrderNumber ad vissza (áruház, nap).

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;

Ha a ANY_VALUE(fs.SalesOrderNumber) kifejezést oszlophivatkozásra fs.SalesOrderNumber cseréli, a címke sorról sorra változik; elveszíti az "egy konzisztens címke minden (áruház, nap)" viselkedését.