【SC-200】KQLクエリの書き方-summarize編

皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第5弾として
今日は集計処理に有効な summarize 演算子を紹介します。

summarize 演算子

summarize演算子は summarize count() by… と書き始めると by の後ろに指定した列の個数を数えてくれます。

SecurityEvent
| where EventID == "4688"
| summarize count() by Process, Computer

このクエリだと by の後ろに Process と Computer の組み合わせで出現するログの数を数えてくれます。
実行結果を見るとわかるように conhost.exe と DC11.na.contosohotels.com の組み合わせは29989個あったよと教えてくれています。

image

もちろん by の後ろは | summarize count() by Process とだけ書けば Process 列の内容だけをもとに個数を数えてくれます。

image

次に1時間以内に出力されたEventIDが4624のログの数を数えているのですが、そのほかに先ほどと異なる点ってわかりますか?

SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == 4624
| summarize cnt=count() by AccountType, Computer

image

列名がcount_ではなく、cntとなってますよね。
| summarize count() の代わりに | summarize cnt=count() と書くことで列名のカスタマイズができます。

2023年6月25日追記
summarize演算子と共にcount()関数を使う例を紹介していますが、他にもcountif()関数のようなExcelっぽい関数を使うこともできます。例えばEventIDが4624のイベントの個数を数えるのであれば、

SecurityEvent
| summarize countif(EventID == 4624)

のように書いてあげます。

dcount関数

count関数を使ってIpAddress列の内容を基にした個数を数えてみました。

image

次にdcountという関数を使って同じIpAddressを指定してみました。

SecurityEvent
| summarize dcount(IpAddress)

image

countとdcountの違い、わかりましたか?
cont関数は同じIPアドレスを持つログの個数を数えているのに対して、
dcount関数は | summarize count() by IpAddress で実行した結果の個数を数えています。

次回はsummarize演算子に続けて使う関数として arg_max, arg_min などを紹介します。