皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第6弾として
今日は summarize 演算子と共に利用することが想定される関数を紹介します。
arg_max関数
前回、summarize演算子では summarize count() by… と書き始める方法を紹介しました。
countの代わりにarg_max()を使うとカッコの中に書いた列の中から最大の値 (つまり時刻で言えば最新の時刻) だけを抽出して出力してくれます。
SecurityEvent | summarize arg_max(TimeGenerated,*) by Computer
このクエリだと by の後ろに Computer と書いているのでコンピューターごとに最後に生成されたSecurityEventのログを表示してくれます。
ですので、これを応用すればSignLogsでゲストユーザーが最後にサインインしたのはいつか?なんてクエリも書けるわけです。
SigninLogs | where UserType =~ "Guest" | summarize arg_max(TimeGenerated,*) by UserPrincipalName
逆にarg_min()関数は最も小さな数値 (時刻で言えばもっとも古いの時刻) だけを取り出して出力します。
SecurityEvent | where Computer == "SQL12.na.contosohotels.com" | summarize arg_min(TimeGenerated,*) by Computer
make_list関数
特定のコンピューターにサインインしたユーザーとして誰がいるか?の一覧を表示したい、なんて時にはmake_list関数を使います。make_list(A) by B と書くと「Bに含まれるAのリストを作成しなさい」という命令になります。下のパターンでは特定のコンピューターにサインイン (EventID=4624) したユーザーのリストを作りなさいという命令を行っています。
SecurityEvent | where EventID == "4624" | summarize make_list(Account) by Computer
実行結果はこちら。コンピューターの単位でサインインしたユーザーのリストが表示されていることがわかります。
make_set関数
make_set関数はmake_listと同じくmake_set(A) by B と書くと「Bに含まれるAのリストを作成しなさい」という命令になります。ただし、その結果の出力はご覧のようになります。
違いはわかりますか?
SecurityEvent | where EventID == "4624" | summarize make_set(Account) by Computer
make_listはすべてのリストを出力するのに対して、make_setの場合はリストの中から重複する値を除いた値 (distinct values) を出力するという違いがあります。
次回はrender演算子を使ってみたいと思います。