Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :Entrepôt dans Microsoft Fabric
La ANY_VALUE fonction retourne une valeur (non possibleNULL ) à partir d’un groupe de lignes. Vous pouvez l’utiliser comme fonction d’agrégation et de fenêtre (analytique) :
- Utilisation agrégée : retourne une valeur arbitraire de l’ensemble du groupe.
- Utilisation de la fenêtre : fonctionne sur un cadre de fenêtre défini et retourne une valeur arbitraire de la fenêtre entière.
Conventions de la syntaxe Transact-SQL
Syntaxe
Syntaxe de la fonction d’agrégation :
ANY_VALUE ( [ ALL | DISTINCT ] expression )
Syntaxe de la fonction analytique :
ANY_VALUE ( [ ALL | DISTINCT ] expression) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )
Arguments
ALL
Applique la fonction d'agrégation à toutes les valeurs. ALL est l’option par défaut, uniquement significative et est disponible uniquement pour la compatibilité ISO.
DISTINCTIF
DISTINCT n’est pas significatif avec ANY_VALUE, et est disponible uniquement pour la compatibilité ISO.
expression
Valeur à retourner. Toutes les valeurs peuvent être retournées comme résultat, mais les NULL valeurs sont ignorées si possible.
CLAUSE OVER
Le partition_by_clause divise le jeu de résultats généré par la FROM clause en partitions et la fonction est appliquée à chaque partition.
Si vous ne spécifiez pas cette clause, la fonction traite toutes les lignes du jeu de résultats de requête en tant que groupe unique.
Le order_by_clause détermine l’ordre des données avant que la fonction ne soit appliquée. Si vous spécifiez partition_by_clause, il détermine l’ordre des données dans la partition. La order_by_clause n’est pas obligatoire.
Pour plus d’informations, consultez la clause SELECT - OVER (Transact-SQL).
Types de retour
Retourne une valeur du même type que l’expression.
Remarques
ANY_VALUE n’est pas déterministe. Pour plus d’informations, consultez Fonctions déterministes et non déterministes. Contrairement FIRST_VALUE ou LAST_VALUE, ANY_VALUE ne fournit pas de classement déterministe. Il est conçu pour les cas où la valeur exacte n’est pas importante pour la logique de requête.
La fonction tente de retourner une valeur non-valeurNULL si possible et retourne NULL la valeur uniquement si toutes les valeurs sont NULL.
Cas d’utilisation
Un cas d’usage courant est le cas ANY_VALUE où vous devez inclure des colonnes non clés dans un jeu de résultats regroupé par une colonne clé. Par exemple, si vous regroupez des lignes par StoreID, vous pouvez utiliser ANY_VALUE pour retourner des valeurs pour les colonnes telles que le nom du magasin, l’adresse ou d’autres attributs descriptifs sans les ajouter à la GROUP BY clause ou en utilisant des fonctions plus coûteuses comme MAX, MINou FIRST_VALUELAST_VALUE pour les inclure dans la projection. Cette approche simplifie la conception des requêtes, améliore la lisibilité et améliore les performances, car la requête SQL n’a pas besoin d’effectuer un regroupement inutile sur les colonnes descriptives. Par conséquent, votre agrégation reste concise, plus facile à gérer et plus efficace.
Exemples
R : Récupérer n’importe quelle valeur non NULL
Cette requête simple montre comment ANY_VALUE retourner une valeur arbitraire non NULL à partir d’un ensemble de valeurs :
SELECT ANY_VALUE(v)
FROM (VALUES (NULL), (NULL), (NULL), (NULL), (2), (NULL), (NULL), (7), (NULL), (NULL)) AS t(v);
La fonction ignore les NULL valeurs et retourne l’une des valeurs non-valeursNULL (parfois 2, parfois 7) d’une manière non déterministe.
B. Colonnes descriptives du projet
Cette requête récapitule le total des ventes par magasin en joignant FactSalesDimStore, en regroupant StoreKeysur et en récupérant les détails du magasin de clés à l’aide ANY_VALUEde .
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;
En appliquant la ANY_VALUE fonction, vous pouvez inclure des colonnes non groupées (telles que StoreName, , StoreDescription, StoreStatusStorePhone, StoreFax, ZipCode, AddressLine1et AddressLine2) sans les répertorier dans la GROUP BY clause.
Chapitre C. Annuler le tableau croisé dynamique des lignes vers des colonnes
Le FactSales tableau contient une ligne par élément de ligne, où OrderKey identifie l’ordre. Pour chaque ordre, les attributs tels que OrderDate, , DeliveryDateCustomerKey, et StoreKey sont répétés sur toutes les lignes appartenant au même OrderKey. En revanche, ProductKey varie selon l’élément de ligne, avec un produit par LineNumber.
La requête suivante pivote les FactSales lignes afin que chacune OrderKey soit une seule ligne. Il conserve les attributs de niveau commande partagé et crée une colonne distincte (ProductKey0, , ProductKey1...) pour le produit associé à chaque numéro de ligne. La ANY_VALUE fonction est utilisée pour sélectionner une valeur représentative de chaque groupe, tandis que les expressions conditionnelles extraient le produit pour chaque élément de ligne spécifique.
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;
En utilisant la ANY_VALUE fonction, vous évitez de placerOrderDate, DeliveryDate, et CustomerKeyStoreKey dans la GROUP BY clause. La ANY_VALUE fonction simplifie la requête et peut améliorer les performances, car une seule colonne (OrderKey) est utilisée dans la GROUP BY clause.
Le ANY_VALUE + CASE WHEN modèle extrait le approprié ProductKey pour chaque élément de ligne et les retourne sous forme de colonnes distinctes. Dans la pratique, ce modèle produit un pivot programmatique des clés de produit (alternative à l’opérateur traditionnel UNPIVOT ).
D. Valeur aléatoire par partition de deux colonnes
Vous produisez un rapport détaillé au niveau des ventes avec un indicateur de performance clé (KPI) quotidien par magasin. Dans le rapport, vous devez retourner la même SalesOrderNumber partition par (StoreKey, DateKey) où aucune règle d’entreprise n’existe pour choisir une règle spécifique SalesOrderNumber. Il n’est pas nécessaire de choisir les commandes les plus anciennes, les plus récentes ou les plus grandes commandes par ligne dans le rapport. Par exemple, l’interface utilisateur affiche « une commande de référence pour le store-day » à côté de chaque ligne afin qu’un analyste puisse rapidement passer à une commande de la paire (magasin, jour).
L’intention est de retourner une cohérence SalesOrderNumber par (magasin, jour).
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;
Si vous remplacez l’expression ANY_VALUE(fs.SalesOrderNumber) par fs.SalesOrderNumber référence de colonne, l’étiquette varie en ligne par ligne ; vous perdez le comportement « une étiquette cohérente par (magasin, jour) ».