Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:Warehouse in Microsoft Fabric
De ANY_VALUE functie retourneert een (indienNULL mogelijk) waarde uit een groep rijen. U kunt deze gebruiken als een statistische functie en een vensterfunctie (analysefunctie):
- Geaggregeerd gebruik: retourneert een willekeurige waarde van de hele groep.
- Venstergebruik: werkt via een gedefinieerd vensterframe en retourneert een willekeurige waarde uit het hele venster.
Transact-SQL syntaxis-conventies
Syntaxis
Syntaxis van aggregatiefunctie:
ANY_VALUE ( [ ALL | DISTINCT ] expression )
Syntaxis van analysefunctie:
ANY_VALUE ( [ ALL | DISTINCT ] expression) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )
Argumenten
ALLE
Hiermee past u de statistische functie toe op alle waarden. ALL is de standaardinstelling, alleen zinvolle optie en is alleen beschikbaar voor ISO-compatibiliteit.
ONDERSCHEIDEND
DISTINCT is niet zinvol met ANY_VALUEen is alleen beschikbaar voor ISO-compatibiliteit.
expressie
De waarde die moet worden geretourneerd. Een van de waarden kan als resultaat worden geretourneerd, maar de NULL waarden worden indien mogelijk overgeslagen.
OVER-component
De partition_by_clause verdeelt de resultatenset die door de FROM component wordt geproduceerd in partities en de functie wordt toegepast op elke partitie.
Als u deze component niet opgeeft, behandelt de functie alle rijen van de queryresultatenset als één groep.
De order_by_clause bepaalt de volgorde van de gegevens voordat de functie wordt toegepast. Als u partition_by_clause opgeeft, wordt de volgorde van de gegevens in de partitie bepaald. De order_by_clause is niet vereist.
Zie SELECT - OVER-component (Transact-SQL)voor meer informatie.
Retourtypen
Retourneert een waarde van hetzelfde type als expressie.
Opmerkingen
ANY_VALUE is niet-deterministisch. Zie Deterministische en niet-deterministische functiesvoor meer informatie. In tegenstelling tot FIRST_VALUE of LAST_VALUE, ANY_VALUE biedt geen deterministische volgorde. Het is ontworpen voor gevallen waarin de exacte waarde niet belangrijk is voor de querylogica.
De functie probeert indien mogelijk een niet-waardeNULL te retourneren en retourneert NULL alleen waarde als alle waarden zijn NULL.
Gebruiksituatie
Een veelvoorkomend gebruiksvoorbeeld ANY_VALUE hiervoor is wanneer u niet-sleutelkolommen moet opnemen in een resultatenset die is gegroepeerd op een sleutelkolom. Als u bijvoorbeeld rijen groepeert StoreIDop, kunt u waarden ANY_VALUE retourneren voor kolommen zoals winkelnaam, adres of andere beschrijvende kenmerken zonder ze toe te voegen aan de GROUP BY component of om dure functies zoals MAX, MINof FIRST_VALUELAST_VALUE om ze op te nemen in de projectie. Deze aanpak vereenvoudigt het ontwerp van query's, verbetert de leesbaarheid en verbetert de prestaties omdat SQL-query geen onnodige groepering hoeft uit te voeren op de beschrijvende kolommen. Als gevolg hiervan blijft uw aggregatie beknopt, eenvoudiger te onderhouden en efficiënter.
Examples
Eén. Een niet-NULL-waarde ophalen
Deze eenvoudige query laat zien hoe ANY_VALUE u een willekeurige niet-NULL-waarde kunt retourneren uit een set waarden:
SELECT ANY_VALUE(v)
FROM (VALUES (NULL), (NULL), (NULL), (NULL), (2), (NULL), (NULL), (7), (NULL), (NULL)) AS t(v);
De functie negeert waarden en retourneert NULL een van de niet-waardenNULL (soms 2, soms 7) op een niet-deterministische manier.
B. Beschrijvende kolommen van project
Deze query geeft een overzicht van de totale verkoop per winkel door deel te nemen aan FactSalesDimStore, groeperen op StoreKeyen sleutelarchiefgegevens op te halen met behulp van 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;
Door de ANY_VALUE functie toe te passen, kunt u niet-groeperingskolommen (zoals StoreName, StoreStatusStoreDescription, StorePhone, , StoreFax, ZipCodeen AddressLine2AddressLine1) opnemen zonder deze in de component op te GROUP BY nemen.
C. Draaitabelwaarden van rijen naar kolommen opheffen
De FactSales tabel bevat één rij per regelitem, waarbij OrderKey de volgorde wordt geïdentificeerd. Voor elke volgorde worden kenmerken zoals OrderDate, DeliveryDate, CustomerKeyen StoreKey herhaald in alle rijen die tot hetzelfde OrderKeybehoren . Verschilt daarentegen ProductKey per regelitem, met één product per LineNumber.
De volgende query draait de FactSales rijen zodanig dat elk OrderKey één rij is. De kenmerken op volgordeniveau blijven behouden en er wordt een afzonderlijke kolom (ProductKey0, ProductKey1, ...) gemaakt voor het product dat aan elk regelnummer is gekoppeld. De ANY_VALUE functie wordt gebruikt om een representatieve waarde uit elke groep te kiezen, terwijl de voorwaardelijke expressies het product voor elk specifiek regelitem extraheren.
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;
Door de ANY_VALUE functie te gebruiken, vermijdt u het plaatsenOrderDate, DeliveryDate, en CustomerKeyStoreKey in de GROUP BY component. De ANY_VALUE functie vereenvoudigt de query en kan de prestaties verbeteren omdat er slechts één kolom (OrderKey) in de GROUP BY component wordt gebruikt.
Het ANY_VALUE + CASE WHEN patroon extraheert het juiste ProductKey voor elk regelitem en retourneert deze als afzonderlijke kolommen. In de praktijk produceert dit patroon een programmatische draai van de productcodes (een alternatief voor de traditionele UNPIVOT operator).
D. Willekeurige waarde per twee kolompartitie
U maakt een detailrapport op verkoopniveau met een dagelijkse KPI (Key Performance Indicator) per winkel. In het rapport moet u dezelfde SalesOrderNumber partitie per (StoreKey, DateKey) retourneren als er geen bedrijfsregel bestaat om een specifieke SalesOrderNumberregel te kiezen. U hoeft in het rapport geen vroegste, meest recente of beste order per regel te kiezen. In de gebruikersinterface wordt bijvoorbeeld 'een referentieorder voor de winkeldag' naast elke regel weergegeven, zodat een analist snel naar een order kan springen vanuit het paar (winkel, dag).
De bedoeling is om één consistent SalesOrderNumber per (winkel, dag) te retourneren.
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;
Als u de ANY_VALUE(fs.SalesOrderNumber) expressie vervangt door fs.SalesOrderNumber kolomverwijzing, varieert het label per rij. U verliest het gedrag 'één consistent label per (winkel, dag)'.