【SC-200】KQLクエリの書き方 – arg_max,arg_min,make_list,make_set編

皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第6弾として
今日は summarize 演算子と共に利用することが想定される関数を紹介します。

arg_max関数

前回、summarize演算子では summarize count() by… と書き始める方法を紹介しました。
countの代わりにarg_max()を使うとカッコの中に書いた列の中から最大の値 (つまり時刻で言えば最新の時刻) だけを抽出して出力してくれます。

SecurityEvent
| summarize arg_max(TimeGenerated,*) by Computer

このクエリだと by の後ろに Computer と書いているのでコンピューターごとに最後に生成されたSecurityEventのログを表示してくれます。

image

ですので、これを応用すればSignLogsでゲストユーザーが最後にサインインしたのはいつか?なんてクエリも書けるわけです。

SigninLogs
| where UserType =~ "Guest"
| summarize arg_max(TimeGenerated,*) by UserPrincipalName

image

逆にarg_min()関数は最も小さな数値 (時刻で言えばもっとも古いの時刻) だけを取り出して出力します。

SecurityEvent 
| where Computer == "SQL12.na.contosohotels.com"
| summarize arg_min(TimeGenerated,*) by Computer

image

make_list関数

特定のコンピューターにサインインしたユーザーとして誰がいるか?の一覧を表示したい、なんて時にはmake_list関数を使います。make_list(A) by B と書くと「Bに含まれるAのリストを作成しなさい」という命令になります。下のパターンでは特定のコンピューターにサインイン (EventID=4624) したユーザーのリストを作りなさいという命令を行っています。

SecurityEvent
| where EventID == "4624"
| summarize make_list(Account) by Computer

実行結果はこちら。コンピューターの単位でサインインしたユーザーのリストが表示されていることがわかります。
image

make_set関数

make_set関数はmake_listと同じくmake_set(A) by B と書くと「Bに含まれるAのリストを作成しなさい」という命令になります。ただし、その結果の出力はご覧のようになります。
違いはわかりますか?

SecurityEvent
| where EventID == "4624"
| summarize make_set(Account) by Computer

image

make_listはすべてのリストを出力するのに対して、make_setの場合はリストの中から重複する値を除いた値 (distinct values) を出力するという違いがあります。

次回はrender演算子を使ってみたいと思います。