top-nested 演算子

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

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

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

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

構文

T|top-nested [ N ] ofExpr [withothers=ConstExpr] by集計 [asc | desc] [,
  top-nested ... ]

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

パラメーター

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

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

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

注意

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

戻り値

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

他の列のデータを含める

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

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

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

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

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

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

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

演算子の使用を開始する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.

出力

State aggregated_State source 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)集計関数は単なるプレースホルダーであり、結果は無関係であるため、プロジェクトアウェー演算子は列を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

出力

State aggregated_State source 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 ひょう
... ... ... ... ... ...

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

句内に top-nested 組み込まれると、上位の withothers 結果から除外されたデータを集計する追加のレコードが仕様に導入されます。 次のクエリでは、 列と aggregated_State 列に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)

出力

State aggregated_State source 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

出力

State source 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 つの最新のイベントを取得する方法を示しています。 で識別される特定の列内での の max(1) 使用に Ignore*注意してください。これは、選択ロジックを適用せずにクエリを通じてデータを伝達するのに役立ちます。

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パーティション分割します。 後続の 句は、 ごとに idに基づいて、最新の 2 つのレコードをtimestamp識別します。 その他の情報は、指定されていないカウントと任意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