Opérateur top-nested

L’opérateur top-nested effectue l’agrégation hiérarchique et la sélection de valeurs.

Imaginez que vous disposez d’un tableau contenant des informations sur les ventes telles que les régions, les vendeurs et les quantités vendues. L’opérateur top-nested peut vous aider à répondre à des questions complexes, telles que « Quelles sont les cinq premières régions par ventes et qui sont les trois premiers vendeurs dans chacune de ces régions ? »

Les données sources sont partitionnées en fonction des critères définis dans la première top-nested clause, comme la région. Ensuite, l’opérateur sélectionne les enregistrements les plus hauts dans chaque partition à l’aide d’une agrégation, comme l’ajout de montants de ventes. Chaque clause suivante top-nested affine les partitions créées par la clause précédente, créant une hiérarchie de groupes plus précis.

Le résultat est une table avec deux colonnes par clause. Une colonne contient les valeurs de partitionnement, telles que la région, tandis que l’autre colonne contient les résultats du calcul d’agrégation, comme la somme des ventes.

Syntax

T|top-nested [ N ] ofExpr [withothers=ConstExpr] byAgrégation [asc | desc] [,
  top-nested ... ]

Découvrez les conventions de syntaxe.

Paramètres

Nom Type Obligatoire Description
T string ✔️ Expression tabulaire d’entrée.
N int Nombre de valeurs supérieures à retourner pour ce niveau de hiérarchie. En cas d’omission, toutes les valeurs distinctes sont retournées.
Expr string ✔️ Expression sur l’enregistrement d’entrée indiquant la valeur à retourner pour ce niveau de hiérarchie. En règle générale, il fait référence à une colonne de T ou implique un calcul comme bin() sur une colonne. Si vous le souhaitez, définissez un nom de colonne de sortie comme Name=Expr.
ConstExpr string S’il est spécifié, pour chaque niveau de hiérarchie, un enregistrement est ajouté avec la valeur qui est l’agrégation sur tous les enregistrements qui n’ont pas été en haut.
Agrégation string Fonction d’agrégation appliquée aux enregistrements avec la même valeur Expr . Le résultat détermine les enregistrements les plus hauts. Consultez Fonctions d’agrégation prises en charge. Si vous le souhaitez, définissez un nom de colonne de sortie commeAgrégation denoms=.

Fonctions d’agrégation prises en charge

Les fonctions d’agrégation suivantes sont prises en charge :

Notes

Toute combinaison algébrique des agrégations est également prise en charge.

Retours

Table avec deux colonnes pour chaque clause. Une colonne contient des valeurs uniques calculées à l’aide d’Expr, et l’autre colonne affiche les résultats obtenus à partir du calcul d’agrégation .

Inclure les données d’autres colonnes

Seules les colonnes spécifiées en tant que top-nested clause Expr sont affichées dans la table de sortie.

Pour inclure toutes les valeurs d’une colonne à un niveau spécifique :

  1. Ne spécifiez pas la valeur de N.
  2. Utilisez le nom de colonne comme valeur d’Expr.
  3. Utilisez Ignore=max(1) comme valeur d’agrégation.
  4. Supprimez la colonne inutile Ignore avec project-away.

Pour obtenir un exemple, consultez Obtenir les événements les plus récents par état avec des données supplémentaires à partir d’autres colonnes.

Considérations relatives aux performances

Le nombre d’enregistrements peut augmenter de façon exponentielle avec le nombre de clauses, et la croissance des top-nested enregistrements est encore plus rapide si aucune limite N n’est spécifiée. Cet opérateur peut consommer une quantité considérable de ressources.

Si la distribution de l’agrégation est considérablement non uniforme, limitez le nombre de valeurs distinctes à retourner en spécifiant N. Ensuite, utilisez la withothers= spécification ConstExpr pour obtenir une indication du poids de tous les autres cas.

Exemples

Prise en main de l’opérateur top-nested

La requête suivante partitionne la StormEvents table en fonction de la State colonne et calcule la latitude totale pour chaque état. La requête sélectionne les deux états les plus hauts avec la somme de latitude la plus élevée. Dans ces deux états principaux, la requête regroupe les données par Source et sélectionne les trois principales sources avec la somme de latitude la plus élevée. Pour chacune des trois principales sources dans les deux états principaux, la requête regroupe les données par EndLocation et sélectionne le avec la somme de EndLocation latitude la plus élevée.

StormEvents                                        // Data source.
| top-nested 2 of State       by sum(BeginLat),    // Top 2 States by total latitude.
  top-nested 3 of Source      by sum(BeginLat),    // Top 3 Sources by total latitude in each State.
  top-nested 1 of EndLocation by sum(BeginLat)     // Top 1 EndLocation by total latitude in each Source and State.

Sortie

State aggregated_State Source aggregated_Source EndLocation aggregated_EndLocation
KANSAS 87771.2355000001 Respect des lois 18744.823 FT SCOTT 264.858
KANSAS 87771.2355000001 Public 22855.6206 BUCKLIN 488.2457
KANSAS 87771.2355000001 Observateur chevronné 21279.7083 SHARON SPGS 388.7404
TEXAS 123400.5101 Public 13650.9079 AMARILLO 246.2598
TEXAS 123400.5101 Respect des lois 37228.5966 PERRYTON 289.3178
TEXAS 123400.5101 Observateur chevronné 13997.7124 CLAUDE 421.44

Améliorer les résultats imbriqués avec les données d’une autre colonne

La requête suivante s’appuie sur l’exemple précédent en introduisant une clause supplémentaire top-nested . Dans cette nouvelle clause, l’absence de spécification numérique entraîne l’extraction de toutes les valeurs distinctes de EventType dans les partitions. La max(1) fonction d’agrégation est simplement un espace réservé, ce qui rend son résultat non pertinent. L’opérateur project-away supprime donc la Ignore colonne. Le résultat montre tous les types d’événements associés aux données précédemment agrégées.

StormEvents
| top-nested 2 of State       by sum(BeginLat),
  top-nested 3 of Source      by sum(BeginLat),
  top-nested 1 of EndLocation by sum(BeginLat),
  top-nested   of EventType   by Ignore = max(1)
| project-away Ignore

Sortie

State aggregated_State Source aggregated_Source EndLocation aggregated_EndLocation Type d’événement
TEXAS 123400.51009999994 Public 13650.907900000002 AMARILLO 246.25979999999998 Grêle
TEXAS 123400.51009999994 Public 13650.907900000002 AMARILLO 246.25979999999998 Vent d’orage
KANSAS 87771.235500000068 Public 22855.6206 BUCKLIN 488.2457 Crue
KANSAS 87771.235500000068 Public 22855.6206 BUCKLIN 488.2457 Vent d’orage
KANSAS 87771.235500000068 Public 22855.6206 BUCKLIN 488.2457 Grêle
TEXAS 123400.51009999994 Observateur chevronné 13997.712400000009 CLAUDE 421.44 Grêle
KANSAS 87771.235500000068 Respect des lois 18744.823000000004 FT SCOTT 264.858 Crue soudaine
KANSAS 87771.235500000068 Respect des lois 18744.823000000004 FT SCOTT 264.858 Vent d’orage
KANSAS 87771.235500000068 Respect des lois 18744.823000000004 FT SCOTT 264.858 Crue
TEXAS 123400.51009999994 Respect des lois 37228.596599999961 PERRYTON 289.3178 Grêle
... ... ... ... ... ...

Utiliser withothers pour explorer les données exclues

Lorsqu’elle est incorporée dans une top-nested clause, la withothers spécification introduit un enregistrement supplémentaire qui agrège les données exclues des premiers résultats. Dans la requête suivante, un enregistrement supplémentaire est créé dans les State colonnes et aggregated_State , représentant la latitude collective de tous les États, à l’exception du Kansas et du Texas. De plus, la EndLocation colonne et aggregated_EndLocation a neuf enregistrements supplémentaires. Ces enregistrements indiquent la latitude combinée des emplacements finaux qui ne sont pas éligibles en tant qu’emplacement supérieur dans chaque état et chaque source.

StormEvents
| top-nested 2 of State with others = "All Other States" by sum(BeginLat),
  top-nested 3 of Source by sum(BeginLat),
  top-nested 1 of EndLocation with others = "All Other End Locations" by sum(BeginLat)

Sortie

State aggregated_State Source aggregated_Source EndLocation aggregated_EndLocation
KANSAS 87771.2355000001 Respect des lois 18744.823 FT SCOTT 264.858
KANSAS 87771.2355000001 Public 22855.6206 BUCKLIN 488.2457
KANSAS 87771.2355000001 Observateur chevronné 21279.7083 SHARON SPGS 388.7404
TEXAS 123400.5101 Public 13650.9079 AMARILLO 246.2598
TEXAS 123400.5101 Respect des lois 37228.5966 PERRYTON 289.3178
TEXAS 123400.5101 Observateur chevronné 13997.7124 CLAUDE 421.44
KANSAS 87771.2355000001 Respect des lois 18744.823 Tous les autres emplacements finaux 18479.965
KANSAS 87771.2355000001 Public 22855.6206 Tous les autres emplacements finaux 22367.3749
KANSAS 87771.2355000001 Observateur chevronné 21279.7083 Tous les autres emplacements finaux 20890.9679
TEXAS 123400.5101 Public 13650.9079 Tous les autres emplacements finaux 13404.6481
TEXAS 123400.5101 Respect des lois 37228.5966 Tous les autres emplacements finaux 36939.2788
TEXAS 123400.5101 Observateur chevronné 13997.7124 Tous les autres emplacements finaux 13576.2724
KANSAS 87771.2355000001 Tous les autres emplacements finaux 24891.0836
TEXAS 123400.5101 Tous les autres emplacements finaux 58523.2932000001
Tous les autres états 1149279.5923 Tous les autres emplacements finaux 1149279.5923

La requête suivante affiche les mêmes résultats pour le premier niveau utilisé dans l’exemple précédent.

StormEvents
| where State !in ('TEXAS', 'KANSAS')
| summarize sum(BeginLat)

Sortie

sum_BeginLat
1149279.5923

Trier les résultats hiérarchiques

Pour obtenir un ordre de tri complet, la requête suivante utilise le tri basé sur les index pour chaque valeur au sein du niveau hiérarchique actuel, par groupe. Ce tri est destiné à organiser le résultat en fonction du niveau imbriqué ultime, en l’occurrence .EndLocation

StormEvents
| top-nested 2 of State by sum(BeginLat),
  top-nested 2 of Source by sum(BeginLat),
  top-nested 4 of EndLocation by sum(BeginLat)
| sort by State, Source, aggregated_EndLocation
| summarize
    EndLocations = make_list(EndLocation, 10000),
    endLocationSums = make_list(aggregated_EndLocation, 10000)
    by State, Source
| extend indicies = range(0, array_length(EndLocations) - 1, 1)
| mv-expand EndLocations, endLocationSums, indicies

Sortie

State Source EndLocations endLocationSums indices
TEXAS Observateur chevronné CLAUDE 421.44 0
TEXAS Observateur chevronné AMARILLO 316.8892 1
TEXAS Observateur chevronné DALHART 252.6186 2
TEXAS Observateur chevronné PERRYTON 216.7826 3
TEXAS Respect des lois PERRYTON 289.3178 0
TEXAS Respect des lois LEAKEY 267.9825 1
TEXAS Respect des lois BRACKETTVILLE 264.3483 2
TEXAS Respect des lois GILMER 261.9068 3
KANSAS Observateur chevronné SHARON SPGS 388.7404 0
KANSAS Observateur chevronné ATWOOD 358.6136 1
KANSAS Observateur chevronné LENORA 317.0718 2
KANSAS Observateur chevronné SCOTT CITY 307.84 3
KANSAS Public BUCKLIN 488.2457 0
KANSAS Public ASHLAND 446.4218 1
KANSAS Public PROTECTION 446.11 2
KANSAS Public MEADE STATE PARK 371.1 3

Obtenir les événements les plus récents par état avec des données supplémentaires provenant d’autres colonnes

La requête suivante montre comment récupérer les deux événements les plus récents pour chaque état des États-Unis, ainsi que les détails pertinents de l’événement. Notez l’utilisation de max(1) dans certaines colonnes, identifiées par Ignore*, qui facilite la propagation des données dans la requête sans imposer de logique de sélection.

StormEvents
| top-nested of State by Ignore0=max(1),                  // Partition the data by each unique value of state.
  top-nested 2 of StartTime by Ignore1=max(StartTime),    // Get the 2 most recent events in each state.
  top-nested of EndTime by Ignore2=max(1),                // Append the EndTime for each event.
  top-nested of EpisodeId by Ignore3=max(1)               // Append the EpisodeId for each event.
| project-away Ignore*                                    // Remove the unnecessary aggregation columns.
| order by State asc, StartTime desc                      // Sort results alphabetically and chronologically.

Obtenir les derniers enregistrements par identité avec des données supplémentaires d’autres colonnes

La requête suivante montre comment extraire les enregistrements les plus récents par identité et s’appuie sur les concepts introduits dans l’exemple précédent. La première top-nested clause partitionne les données par des valeurs distinctes de id. La clause suivante identifie les deux enregistrements les plus récents en fonction du timestamp pour chaque id. D’autres informations sont ajoutées à l’aide d’un top-nested opérateur avec un nombre non spécifié et l’agrégation arbitraire max(1) . Enfin, les colonnes d’agrégation inutiles sont supprimées à l’aide de l’opérateur project-away .

datatable(id: string, timestamp: datetime, otherInformation: string) // Create a source datatable.
[
    "Barak", datetime(2015-01-01), "1",
    "Barak", datetime(2016-01-01), "2",
    "Barak", datetime(2017-01-20), "3",
    "Donald", datetime(2017-01-20), "4",
    "Donald", datetime(2017-01-18), "5",
    "Donald", datetime(2017-01-19), "6"
]
| top-nested of id by Ignore0=max(1),                     // Partition the data by each unique value of id.
  top-nested 2 of timestamp by Ignore1=max(timestamp),    // Get the 2 most recent events for each state.
  top-nested of otherInformation by Ignore2=max(1)        // Append otherInformation for each event.
| project-away Ignore0, Ignore1, Ignore2                  // Remove the unnecessary aggregation columns.

Sortie

id timestamp otherInformation
Barak 2016-01-01T00 :00 :00Z 2
Donald 2017-01-19T00 :00 :00Z 6
Barak 2017-01-20T00 :00 :00Z 3
Donald 2017-01-20T00 :00 :00Z 4