4tdg-20250916 [PS] Kusto Query Language (KQL) from Scratch 3
https://app.pluralsight.com/library/courses/kusto-query-language-kql-from-scratch/table-of-contents
- 1 Advanced Aggreations
- 1.1 The arg_max and arg_min Commands
- 1.1.1 1. 기본 집계 함수
- 1.1.2 2. 고급 집계 함수
- 1.1.3 3. 주의 사항
- 1.1.4 4. 활용 예시
- 1.2 The makeset and makelist Commands
- 1.2.1 1. makeset()
- 1.2.2 2. makelist()
- 1.2.3 3. 공통 옵션
- 1.2.4 4. 차이점 요약
- 1.3 The mvexpand Command
- 1.3.1 1. 기본 개념
- 1.3.2 2. 사용 예시 1 – 배열 행으로 변환
- 1.3.3 3. 사용 예시 2 – JSON Key-Value 확장
- 1.3.4 4. 주요 활용처
- 1.3.5 5. 정리
- 1.4 The percentiles Command
- 1.4.1 1. 기본 개념
- 1.4.2 2. 사용 예시
- 1.4.3 3. 열 이름 사용자 지정 방법
- 1.4.4 4. 다양한 백분위 지정 가능
- 1.4.5 5. 배열 형태 반환: percentiles_array
- 1.4.6 6. 정리
- 1.5 The dcount Command
- 1.5.1 1. 기본 개념
- 1.5.2 2. 사용 예시
- 1.5.3 3. 정확도 옵션 (2번째 인자)
- 1.5.4 4. 비교: distinct count vs dcount
- 1.5.5 5. 활용 예시
- 1.6 The dcountIf Command
- 1.6.1 1. 기능
- 1.6.2 2. 기본 구조
- 1.6.3 3. 정확도 조절 (3번째 매개변수)
- 1.6.4 4. 비교 요약
- 1.6.5 5. 활용 예
- 1.7 The countif Command
- 1.7.1 1. 기능
- 1.7.2 2. 기본 구조
- 1.7.3 3. count vs countif 차이
- 1.7.4 4. 활용 팁
- 1.7.5 5. 예시
- 1.8 The pivot Command
- 1.9 The top-nested Command
- 1.10 The max and min Commands
- 1.11 The sum and sumif Commands
- 1.11.1 1. sum()
- 1.11.2 2. sumif()
- 1.11.3 3. 차이점 비교
- 1.11.4 4. 활용 예시
- 1.12 The any Command
- 1.12.1 1. 기능
- 1.12.2 2. 기본 사용법
- 1.12.3 3. 그룹화와 함께 사용
- 1.12.4 4. 활용 목적
- 1.12.5 5. 특징
- 1.1 The arg_max and arg_min Commands
Advanced Aggreations
The arg_max and arg_min Commands
1. 기본 집계 함수
min()
: 최소값 반환max()
: 최대값 반환
2. 고급 집계 함수
1) arg_max(max값, 기타 컬럼들...)
최댓값을 가진 행(row)에서 지정된 컬럼들까지 함께 반환
예:
summarize arg_max(CounterValue, *) by CounterName
→ 각 CounterName에 대해 최대 CounterValue + 해당 행의 모든 컬럼 반환
선택된 컬럼만 가져오고 싶을 때:
summarize arg_max(CounterValue, Computer, ObjectName) by CounterName
2) arg_min(min값, 기타 컬럼들...)
arg_max()
와 동일한 원리로 최솟값 기준 행의 컬럼들 반환단,
summarize
이전에project
로 컬럼 제한하면 결과가 축소됨
3. 주의 사항
arg_max
/arg_min
은 추가 컬럼 지정이 가능한 것이 핵심 장점단순히 최소/최대 숫자만 필요하다면
min()
,max()
사용으로 충분
4. 활용 예시
집계 함수 | 사용 목적 |
---|---|
| 최대값만 확인할 때 |
| 최대값을 가진 행 전체를 확인할 때 |
| 최대값과 관련 컬럼만 선택적으로 확인할 때 |
The makeset and makelist Commands
1. makeset()
중복 없이 특정 값을 배열(array)로 수집
사용 예:
summarize makeset(CounterName) by ObjectName
→ ObjectName별로 관련된 고유한 CounterName 목록을 배열로 생성
활용 예:
where CounterName == "Free Space" and CounterValue <= 30 summarize makeset(Computer) by CounterName
→ 특정 조건을 만족하는 컴퓨터 목록 배열 생성 (중복 제거)
2. makelist()
중복 허용하여 값을 배열로 수집
사용 예:
summarize makelist(Computer) by CounterName
→ 동일 컴퓨터가 여러 번 나타나도 모두 포함
3. 공통 옵션
최대 배열 크기 지정 가능 (기본: 128개)
summarize makeset(Computer, 256) by CounterName summarize makelist(Computer, 256) by CounterName
4. 차이점 요약
연산자 | 중복 제거 | 기본 최대 길이 | 주 용도 |
---|---|---|---|
| O | 128 | 고유 값 목록을 만들 때 |
| X | 128 | 값의 빈도나 순서를 유지할 때 |
The mvexpand Command
1. 기본 개념
mvexpand
는 배열(array) 또는 JSON 속성 목록을 행(row) 단위로 펼치는(확장하는) 데 사용됨
2. 사용 예시 1 – 배열 행으로 변환
Perf
| where CounterName == "Free Space" and CounterValue <= 30
| summarize makeset(Computer) by CounterName
| mvexpand Computer
makeset()
으로 만든 컴퓨터 배열을mvexpand
로 하나씩 행으로 펼침
3. 사용 예시 2 – JSON Key-Value 확장
MyAlerts
| extend Props = todynamic(ExtendedProperties)
| mvexpand Props
| project TimeGenerated, DisplayName, AlertName, Severity, Props
todynamic()
으로 JSON을 변환한 뒤mvexpand
로 각 key-value 쌍을 개별 행으로 분리각 행에는 동일한 Alert 정보 + 다른 속성이 나옴
4. 주요 활용처
용도 | 설명 |
---|---|
배열 값을 개별 행으로 분리 |
|
JSON key-value 분해 |
|
각 항목별 상세 분석 필요 시 | 배열 또는 다중 속성 데이터를 분석 단위로 쪼개기 |
5. 정리
함수 | 기능 |
---|---|
| 중복 없이 배열 생성 |
| 중복 포함 배열 생성 |
| 배열 또는 JSON을 개별 행으로 분해 |
The percentiles Command
1. 기본 개념
percentiles()
함수는 샘플 값 중 x%보다 큰 값을 계산함통계 분석 시 분포 파악에 매우 유용함
2. 사용 예시
Perf
| where CounterName == "AvailableMBytes"
| summarize percentiles(CounterValue, 5, 50, 95) by Computer
CounterValue
값을 5%, 50%, 95% 기준으로 계산결과 열:
percentile_CounterValue_5
,percentile_CounterValue_50
,percentile_CounterValue_95
3. 열 이름 사용자 지정 방법
project-rename
사용| project-rename Percent05 = percentile_CounterValue_5
요약 구문 내 직접 명명
summarize (Percent05, Percent50, Percent95) = percentiles(CounterValue, 5, 50, 95)
4. 다양한 백분위 지정 가능
kql
복사편집
percentiles(CounterValue, 10, 30, 50, 70, 90)
원하는 만큼 세분화 가능
5. 배열 형태 반환: percentiles_array
summarize percentiles_array(CounterValue, 5, 50, 95) by Computer
단일 배열로 백분위 결과를 반환
이후
mvexpand
를 이용해 행 단위로 분해 가능
6. 정리
함수 | 설명 |
---|---|
| 각 백분위에 해당하는 값을 개별 열로 반환 |
| 백분위 값들을 배열로 반환 |
| 배열 형태 반환 시 각 값을 행으로 변환할 때 사용 |
percentiles
함수는 성능 지표나 로그 데이터의 분포를 이해하고 임계값을 설정하는 데 유용한 통계 함수입니다.
The dcount Command
1. 기본 개념
dcount()
는 고속으로 고유값의 개수를 추정하는 함수정확한
distinct count
보다 빠름 (대신 약간의 오차 허용)
2. 사용 예시
SecurityEvent
| summarize dcount(EventID) by Computer
각 컴퓨터별로 고유한 EventID 수 추정
3. 정확도 옵션 (2번째 인자)
값 | 오차율 | 특징 |
---|---|---|
0 | ~1.6% | 가장 빠름, 오차 큼 |
1 | ~0.8% | 기본값 (속도/정확도 균형) |
2 | ~0.4% | 정확하지만 더 느림 |
3 | ~0.28% | 가장 정확하지만 가장 느림 |
4. 비교: distinct count
vs dcount
항목 |
|
|
---|---|---|
정확도 | 100% 정확 | 추정값 (약간의 오차 있음) |
속도 | 느림 (대량 데이터일수록) | 빠름 |
사용 예 | 소규모/정확성 중요 시 | 대규모/속도 우선 시 |
5. 활용 예시
SecurityEvent
| where TimeGenerated > ago(90d)
| summarize dcount(EventID, 1) by Computer
최근 90일 동안 각 컴퓨터에 대해 발생한 고유 보안 이벤트 수 추정
The dcountIf Command
1. 기능
조건부 고유값 개수 추정 (boolean 조건이
true
인 행만 포함)dcount()
의 변형으로, 필터링된 행에 대해서만 추정된 고유값 개수 반환
2. 기본 구조
summarize dcountif(ColumnToCount, Condition)
예시:
SecurityEvent
| summarize dcountif(EventID, EventID in (4625, 4688)) by Computer
각 컴퓨터별로 4625 또는 4688 이벤트 ID가 몇 종류 있었는지 추정
3. 정확도 조절 (3번째 매개변수)
정확도 값 | 오차율 | 특징 |
---|---|---|
0 | 약 1.6% | 가장 빠름, 오차 큼 |
1 (기본) | 약 0.8% | 속도/정확도 균형 |
2 | 약 0.4% | 가장 정확, 가장 느림 |
3 | 사용 불가 |
|
4. 비교 요약
항목 |
|
|
---|---|---|
사용 목적 | 전체 고유값 추정 | 조건을 만족하는 고유값만 추정 |
입력 | 컬럼 | 컬럼 + 조건식 |
정확도 조절 | 0, 1, 2, 3 가능 | 0, 1, 2만 가능 |
5. 활용 예
SecurityEvent | summarize dcountif(EventID, EventID in (4625, 4688), 1) by Computer
각 컴퓨터에서 특정 보안 이벤트 종류 수를 추정 (오차율 0.8%)
The countif Command
1. 기능
count()
의 변형으로, 특정 조건을 만족하는 행만 집계조건이 참(
true
)인 경우만 카운트
2. 기본 구조
summarize countif(조건) by 그룹기준
예시:
Perf
| summarize RowCount = countif(CounterName contains "Bytes") by CounterName
CounterName
별로"Bytes"
를 포함하는 경우만 카운트"Bytes"
가 없는 항목은0
으로 표시됨
3. count
vs countif
차이
항목 |
|
|
---|---|---|
쿼리 예시 | `where ... | summarize count()` |
0 포함 여부 | 조건을 만족하지 않으면 행이 아예 없음 | 조건을 만족하지 않으면 행은 있고 값은 0 |
후처리 가능 여부 | 불필요한 행이 이미 제거됨 |
|
4. 활용 팁
조건부 통계가 필요한 경우 유용
(예: 특정 문자열 포함 여부, 날짜 조건 등)후속 필터링을 통해 0 건수 제거 가능
5. 예시
Perf
| summarize RowCount = countif(CounterName contains "Bytes") by CounterName | where RowCount > 0
"Bytes"
를 포함한 항목만 카운트0인 결과는 필터링하여 제거
The pivot Command
1. 기능
행 기반 데이터를 열 기반 데이터로 전환
특정 열의 값을 새로운 열 이름(Column) 으로 만들고, 각 값에 대한 집계(Aggregation) 수행
2. 활용 목적
같은 컴퓨터에 대한 다양한 이벤트 수준(예: Error, Warning) 을 한 행에 나란히 표시하고 싶을 때 사용(→ 가독성과 분석 용이성 증가)
3. 사용 예시
Event
| summarize count() by Computer, EventLevelName
| evaluate pivot(EventLevelName)
EventLevelName
값(Error, Warning 등)을 열로 전환각 컴퓨터별로 열당 이벤트 수를 합산하여 표시
4. 결과 예시
Computer | Error | Warning |
---|---|---|
AZTest | 16 | 0 |
ContosoRetail | 3 | 2 |
5. 핵심 요점
pivot
은evaluate pivot(<열이름>)
형태로 사용자동으로 집계 함수(count, sum 등) 를 적용하여 열 생성
행을 열로 변환하고 요약 정보를 쉽게 확인 가능
The top-nested Command
1. 기능
계층 구조(그룹 내 그룹) 에서 각각의 Top N 항목을 추출할 수 있도록 해주는 연산자
단일 수준(top)과 달리 다단계(Nested) Top N 결과 제공
2. 사용 목적
예:
상위 3개의
ObjectName
을 찾고각
ObjectName
에 대해 상위 3개의CounterName
을 찾고추가로 각
CounterName
에 대해 상위 3개의InstanceName
도 찾고 싶을 때
3. 형식 예시
Perf
| summarize count() by ObjectName, CounterName
| top-nested 3 of ObjectName
by ObjectCount = count()
top-nested 3 of CounterName
by CounterNameCount = count()
4. 주요 특징
항목 | 설명 |
---|---|
다중 그룹화 | 그룹 내부에서 또 다른 그룹의 상위 N개 추출 |
지원 함수 |
|
결과 계층화 | 출력 결과가 Object → Counter → Instance 등 계층 구조로 정렬됨 |
with others 옵션 | 상위 N개 외 나머지 값을 하나로 묶어 |
5. 활용 예
| top-nested 3 of ObjectName
by count()
with others = "All Other Objects"
top-nested 3 of CounterName
by count()
with others = "All Other Counters"
결과에는 상위 3개 항목 외에
"기타 나머지(All Other ...)"
그룹도 포함되어 분석 가능
6. 요약
top-nested
는 다단계 그룹별 상위 데이터를 추출할 수 있는 고급 연산자복잡한 계층형 데이터 요약이나 분석 리포트 작성 시 매우 유용함
The max and min Commands
1. 기능
최대값(
max
) 또는 최소값(min
)을 계산함arg_max
,arg_min
과 달리 추가 열을 반환하지 않음
2. 사용 예시
Perf
| where CounterName == "Free Megabytes"
| summarize max(CounterValue)
Free Megabytes
의 최댓값 반환: 예) 2,718,479
Perf
| where CounterName == "Free Megabytes"
| summarize min(CounterValue)
Free Megabytes
의 최솟값 반환: 예) 60
3. 차이점 비교
연산자 | 설명 |
---|---|
| 최대값이 있는 행 전체(추가 열 포함)를 반환 |
| 최대값 하나만 반환 |
| 최소값이 있는 행 전체를 반환 |
| 최소값 하나만 반환 |
4. 사용 목적
단순 통계가 필요할 때 사용
데이터의 최대/최소 범위를 파악할 때 유용
The sum and sumif Commands
1. sum()
특정 열의 전체 합계를 계산
주로 숫자형 데이터의 총합을 구할 때 사용
예시
Perf
| where CounterName == "Free Megabytes"
| summarize sum(CounterValue)
Free Megabytes
의 총합을 계산
2. sumif()
조건이 참인 경우에만 합산
countif()
와 유사하게 조건 필터링이 가능
예시
Perf
| summarize sumif(CounterValue, CounterName == "Free Megabytes")
CounterName
이"Free Megabytes"
인 행만 합산
3. 차이점 비교
함수 | 설명 |
---|---|
| 조건절이 필요할 경우 |
| 조건을 함수 내부에서 바로 적용 가능 |
4. 활용 예시
전체 사용량, 총 수치, 리소스 합계 계산에 유용
조건부 합산이 필요한 경우
sumif()
사용
The any Command
1. 기능
데이터셋에서 무작위로 행(Row) 하나를 선택하여 반환함
성능 테스트나 샘플 데이터 추출에 유용
2. 기본 사용법
Perf
| summarize any(*)
전체 열에서 임의의 한 행 전체 컬럼값 반환
Perf
| summarize any(Computer)
Computer
열에서 임의의 값 반환
Perf
| summarize any(ObjectName), any(CounterName), any(CounterValue)
지정한 여러 열의 무작위 행 값 추출
3. 그룹화와 함께 사용
Perf
| summarize any(*) by CounterName
CounterName
별로 각 그룹에서 무작위 행 하나씩 반환
4. 활용 목적
용도 | 설명 |
---|---|
샘플 데이터 조회 | 무작위로 행을 선택해 테이블 상태 점검 가능 |
데이터 탐색 초기 분석 | 특정 컬럼의 대표 예시 값 확인 |
성능 개선을 위한 테스트 | 전체가 아닌 무작위 한 줄만 조회해 빠르게 테스트 가능 |
5. 특징
매 실행 시마다 결과가 달라질 수 있음
무작위성을 활용한 간단한 유효성 검사나 데이터 확인에 유리