次の方法で共有


top-nested 演算子

top-nested演算子は、階層的な集計と値の選択を実行します。

地域、営業担当者、販売金額などの売上情報を含むテーブルがあるとします。 top-nested オペレーターは、"売上別の上位 5 つの地域とは何か、それらの各リージョンで上位 3 人の営業担当者は誰か" など、複雑な質問に答えるのに役立ちます。

ソース データは、リージョンなどの最初の top-nested 句で設定された条件に基づいてパーティション分割されます。 次に、オペレーターは、売上金額の追加などの集計を使用して、各パーティションの上位レコードを選択します。 後続の各 top-nested 句では、前の句によって作成されたパーティションが調整され、より正確なグループの階層が作成されます。

結果は、句ごとに 2 つの列を含むテーブルになります。 1 つの列にはリージョンなどのパーティション分割値が保持され、もう 1 つの列には売上の合計などの集計計算の結果が保持されます。

構文

T | top-nested [ N ] of Expr [with others = ConstExpr] by Aggregation [asc | desc] [,
  top-nested ... ]

構文規則について詳しく知る。

パラメーター

件名 タイプ Required 説明
T string ✔️ 表形式の入力式。
N int この階層レベルで返される最上位の値の数。 省略すると、すべての個別の値が返されます。
Expr string ✔️ この階層レベルで返す値を示す入力レコードに対する式。 通常は、 T からの列を参照するか 列に対する bin() などの計算が含まれます。 必要に応じて、出力列名を Name = Expr として設定します。
ConstExpr string 指定した場合、階層レベルごとに 1 つのレコードが追加され、その値は最上位に設定されなかったすべてのレコードの集計になります。
集約 string 同じ Expr 値を持つレコードに適用される集計関数。 結果によって上位レコードが決まります。 Supported 集計関数を参照してください。 必要に応じて、出力列名を Name = Aggregation として設定します。

サポートされている集計関数

サポートされている集計関数は次のとおりです。

Note

集計の代数の組み合わせもサポートされています。

返品

句ごとに 2 つの列を持つテーブル。 1 つの列には Expr を使用して計算された一意の値が含まれており、もう 1 つの列には Aggregation 計算から得られた結果が表示されます。

他の列のデータを含める

出力テーブルには、 top-nested 句として指定 Expr 列のみが表示されます。

特定のレベルで列のすべての値を含めるには:

  1. Nの値を指定しないでください。
  2. 列名を Expr の値として使用します。
  3. Ignore=max(1)Aggregation の値として使用します。
  4. project-awayで不要なIgnore列を削除します。

例については、「 他の列からの追加データを含む状態ごとの最新のイベントを取得するを参照してください。

パフォーマンスに関する考慮事項

レコードの数は、 top-nested 句の数に応じて指数関数的に増加する可能性があり、 N 制限が指定されていない場合、レコードの増加はさらに速くなります。 このオペレーターは、大量のリソースを消費する可能性があります。

集計の分布が大幅に均一でない場合は、 N を指定して、返す個別の値の数を制限します。次に、 with others = ConstExpr 仕様を使用して、他のすべてのケースの重みを示す値を取得します。

top-nested 演算子の概要

次のクエリでは、 StormEvents テーブルを State 列でパーティション分割し、各状態の合計緯度を計算します。 クエリでは、緯度の合計が最も高い上位 2 つの状態が選択されます。 これらの上位 2 つの状態内で、クエリはデータを Source グループ化し、最も緯度の高い合計を持つ上位 3 つのソースを選択します。 上位 2 つの状態の上位 3 つのソースごとに、クエリはデータを EndLocation グループ化し、最も緯度の高い合計を持つ EndLocation を選択します。

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.

出力

都道府県 aggregated_State ソース aggregated_Source EndLocation aggregated_EndLocation
KANSAS 87771.2355000001 法執行機関 18744.823 FT SCOTT 264.858
KANSAS 87771.2355000001 パブリック 22855.6206 BUCKLIN 488.2457
KANSAS 87771.2355000001 訓練を受けた観測員 21279.7083 SHARON SPGS 388.7404
テキサス州 123400.5101 パブリック 13650.9079 AMARILLO 246.2598
テキサス州 123400.5101 法執行機関 37228.5966 PERRYTON 289.3178
テキサス州 123400.5101 訓練を受けた観測員 13997.7124 CLAUDE 421.44

別の列のデータを使用して、上位の入れ子になった結果を強化する

次のクエリは、追加の top-nested 句を導入することで、前の例に基づいています。 この新しい句では、数値指定が存在しない場合、パーティション全体で EventType のすべての個別の値が抽出されます。 max(1)集計関数は単なるプレースホルダーであり、結果は無関係であるため、project-away 演算子はIgnore列を削除します。 結果には、以前に集計されたデータに関連付けられているすべてのイベントの種類が表示されます。

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

出力

都道府県 aggregated_State ソース aggregated_Source EndLocation aggregated_EndLocation EventType
テキサス州 123400.51009999994 パブリック 13650.907900000002 AMARILLO 246.25979999999998 ひょう
テキサス州 123400.51009999994 パブリック 13650.907900000002 AMARILLO 246.25979999999998 雷雨風
KANSAS 87771.235500000068 パブリック 22855.6206 BUCKLIN 488.2457 洪水
KANSAS 87771.235500000068 パブリック 22855.6206 BUCKLIN 488.2457 雷雨風
KANSAS 87771.235500000068 パブリック 22855.6206 BUCKLIN 488.2457 ひょう
テキサス州 123400.51009999994 訓練を受けた観測員 13997.712400000009 CLAUDE 421.44 ひょう
KANSAS 87771.235500000068 法執行機関 18744.823000000004 FT SCOTT 264.858 鉄砲水
KANSAS 87771.235500000068 法執行機関 18744.823000000004 FT SCOTT 264.858 雷雨風
KANSAS 87771.235500000068 法執行機関 18744.823000000004 FT SCOTT 264.858 洪水
テキサス州 123400.51009999994 法執行機関 37228.596599999961 PERRYTON 289.3178 ひょう
... ... ... ... ... ...

with othersを使用して除外されたデータを探索する

top-nested句内に組み込まれると、with others仕様では、上位の結果から除外されたデータを集計する追加のレコードが導入されます。 次のクエリでは、 State 列と aggregated_State 列に追加のレコードが作成されます。これは、Kansas と Texas を除くすべての州の集合的な緯度を表します。 さらに、 EndLocation 列と aggregated_EndLocation 列には、追加の 9 つのレコードがあります。 これらのレコードは、各状態とソース内の最上位の場所として修飾されていない終了位置の結合された緯度を示します。

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)

出力

都道府県 aggregated_State ソース aggregated_Source EndLocation aggregated_EndLocation
KANSAS 87771.2355000001 法執行機関 18744.823 FT SCOTT 264.858
KANSAS 87771.2355000001 パブリック 22855.6206 BUCKLIN 488.2457
KANSAS 87771.2355000001 訓練を受けた観測員 21279.7083 SHARON SPGS 388.7404
テキサス州 123400.5101 パブリック 13650.9079 AMARILLO 246.2598
テキサス州 123400.5101 法執行機関 37228.5966 PERRYTON 289.3178
テキサス州 123400.5101 訓練を受けた観測員 13997.7124 CLAUDE 421.44
KANSAS 87771.2355000001 法執行機関 18744.823 その他すべての終了場所 18479.965
KANSAS 87771.2355000001 パブリック 22855.6206 その他すべての終了場所 22367.3749
KANSAS 87771.2355000001 訓練を受けた観測員 21279.7083 その他すべての終了場所 20890.9679
テキサス州 123400.5101 パブリック 13650.9079 その他すべての終了場所 13404.6481
テキサス州 123400.5101 法執行機関 37228.5966 その他すべての終了場所 36939.2788
テキサス州 123400.5101 訓練を受けた観測員 13997.7124 その他すべての終了場所 13576.2724
KANSAS 87771.2355000001 その他すべての終了場所 24891.0836
テキサス州 123400.5101 その他すべての終了場所 58523.2932000001
他のすべての州 1149279.5923 その他すべての終了場所 1149279.5923

次のクエリは、前の例で使用した最初のレベルと同じ結果を示しています。

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

出力

sum_BeginLat
1149279.5923

階層的な結果を並べ替える

包括的な並べ替え順序を実現するために、次のクエリでは、グループごとに、現在の階層レベル内の値ごとにインデックスベースの並べ替えを使用します。 この並べ替えは、最終的な入れ子になったレベル (この場合は 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

出力

都道府県 ソース EndLocations endLocationSums インデックス
テキサス州 訓練を受けた観測員 CLAUDE 421.44 0
テキサス州 訓練を受けた観測員 AMARILLO 316.8892 1
テキサス州 訓練を受けた観測員 DALHART 252.6186 2
テキサス州 訓練を受けた観測員 PERRYTON 216.7826 3
テキサス州 法執行機関 PERRYTON 289.3178 0
テキサス州 法執行機関 LEAKEY 267.9825 1
テキサス州 法執行機関 BRACKETTVILLE 264.3483 2
テキサス州 法執行機関 GILMER 261.9068 3
KANSAS 訓練を受けた観測員 SHARON SPGS 388.7404 0
KANSAS 訓練を受けた観測員 ATWOOD 358.6136 1
KANSAS 訓練を受けた観測員 LENORA 317.0718 2
KANSAS 訓練を受けた観測員 SCOTT CITY 307.84 3
KANSAS パブリック BUCKLIN 488.2457 0
KANSAS パブリック ASHLAND 446.4218 1
KANSAS パブリック 保護 446.11 2
KANSAS パブリック MEADE STATE PARK 371.1 3

他の列から追加のデータを使用して、状態ごとの最新のイベントを取得する

次のクエリは、関連するイベントの詳細と共に、米国の状態ごとに最新の 2 つのイベントを取得する方法を示しています。 Ignore*によって識別される特定の列内でmax(1)が使用されていることに注意してください。これは、選択ロジックを適用せずにクエリを通じてデータを伝達する際に役立ちます。

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.

他の列から追加データを含む ID ごとの最新のレコードを取得する

次のクエリでは、ID ごとに最新のレコードを抽出する方法を示し、前の例で紹介した概念に基づいています。 最初の top-nested 句は、 idの個別の値によってデータをパーティション分割します。 後続の句は、各idtimestampに基づいて、最新の 2 つのレコードを識別します。 その他の情報は、指定されていないカウントと任意のmax(1)集計と共に、top-nested演算子を使用して追加されます。 最後に、不要な集計列は、 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.

出力

ID timestamp otherInformation
バラクオバマ 2016-01-01T00:00:00Z 2
ドナルド 2017-01-19T00:00:00Z 6
バラクオバマ 2017-01-20T00:00:00Z 3
ドナルド 2017-01-20T00:00:00Z 4