다음을 통해 공유


time_weighted_avg_fl()

적용 대상: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

이 함수 time_weighted_avg_fl()입력 시간 bin을 통해 지정된 기간 동안 메트릭의 시간 가중 평균을 계산하는 UDF(사용자 정의 함수)입니다. 이 함수는 summarize 연산자와 비슷합니다. 함수는 시간 bin별로 메트릭을 집계하지만 각 bin에 있는 메트릭 값의 단순 avg() 를 계산하는 대신 각 값의 기간을 기준으로 가중치를 지정합니다. 기간은 현재 값의 타임스탬프에서 다음 값의 타임스탬프까지 정의됩니다.

시간 가중 평균을 계산하는 두 가지 옵션이 있습니다. 이 함수는 현재 샘플에서 다음 샘플까지 값을 전달합니다. 또는 time_weighted_avg2_fl()는 연속 샘플 간에 메트릭 값을 선형으로 보간합니다.

구문

T | invoke time_weighted_avg_fl(, t_col y_col, key_col , stime etime, , dt)

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

이름 Type 필수 설명
t_col string ✔️ 레코드의 타임스탬프를 포함하는 열의 이름입니다.
y_col string ✔️ 레코드의 메트릭 값을 포함하는 열의 이름입니다.
key_col string ✔️ 레코드의 파티션 키를 포함하는 열의 이름입니다.
stime datetime ✔️ 집계 창의 시작 시간입니다.
etime datetime ✔️ 집계 창의 종료 시간입니다.
dt timespan ✔️ 집계 시간 bin입니다.

함수 정의

다음과 같이 해당 코드를 쿼리 정의 함수로 포함하거나 데이터베이스에 저장된 함수로 만들어 함수를 정의할 수 있습니다.

다음 let 문을 사용하여 함수를 정의합니다. 사용 권한이 필요 없습니다.

Important

let 문자체적으로 실행할 수 없습니다. 그 뒤에 테이블 형식 식 문이 있어야 합니다. 작업 예제 time_weighted_avg_fl()를 실행하려면 예제를 참조 하세요.

let time_weighted_avg_fl=(tbl:(*), t_col:string, y_col:string, key_col:string, stime:datetime, etime:datetime, dt:timespan)
{
    let tbl_ex = tbl | extend _ts = column_ifexists(t_col, datetime(null)), _val = column_ifexists(y_col, 0.0), _key = column_ifexists(key_col, '');
    let _etime = etime + dt;
    let gridTimes = range _ts from stime to _etime step dt | extend _val=real(null), dummy=1;
    let keys = materialize(tbl_ex | summarize by _key | extend dummy=1);
    gridTimes
    | join kind=fullouter keys on dummy
    | project-away dummy, dummy1
    | union tbl_ex
    | where _ts between (stime.._etime)
    | partition hint.strategy=native by _key (
        order by _ts asc, _val nulls last
        | scan declare(f_value:real=0.0) with (step s: true => f_value = iff(isnull(_val), s.f_value, _val);) // fill forward null values
        | extend diff_t=(next(_ts)-_ts)/1m
    )
    | where isnotnull(diff_t)
    | summarize tw_sum=sum(f_value*diff_t), t_sum =sum(diff_t) by bin_at(_ts, dt, stime), _key
    | where t_sum > 0 and _ts <= etime
    | extend tw_avg = tw_sum/t_sum
    | project-away tw_sum, t_sum
};
// Write your query to use the function here.

예시

다음 예제에서는 호출 연산자를 사용하여 함수를 실행합니다.

쿼리 정의 함수를 사용하려면 포함된 함수 정의 후에 호출합니다.

let time_weighted_avg_fl=(tbl:(*), t_col:string, y_col:string, key_col:string, stime:datetime, etime:datetime, dt:timespan)
{
    let tbl_ex = tbl | extend _ts = column_ifexists(t_col, datetime(null)), _val = column_ifexists(y_col, 0.0), _key = column_ifexists(key_col, '');
    let _etime = etime + dt;
    let gridTimes = range _ts from stime to _etime step dt | extend _val=real(null), dummy=1;
    let keys = materialize(tbl_ex | summarize by _key | extend dummy=1);
    gridTimes
    | join kind=fullouter keys on dummy
    | project-away dummy, dummy1
    | union tbl_ex
    | where _ts between (stime.._etime)
    | partition hint.strategy=native by _key (
        order by _ts asc, _val nulls last
        | scan declare(f_value:real=0.0) with (step s: true => f_value = iff(isnull(_val), s.f_value, _val);) // fill forward null values
        | extend diff_t=(next(_ts)-_ts)/1m
    )
    | where isnotnull(diff_t)
    | summarize tw_sum=sum(f_value*diff_t), t_sum =sum(diff_t) by bin_at(_ts, dt, stime), _key
    | where t_sum > 0 and _ts <= etime
    | extend tw_avg = tw_sum/t_sum
    | project-away tw_sum, t_sum
};
let tbl = datatable(ts:datetime,  val:real, key:string) [
    datetime(2021-04-26 00:00), 100, 'Device1',
    datetime(2021-04-26 00:45), 300, 'Device1',
    datetime(2021-04-26 01:15), 200, 'Device1',
    datetime(2021-04-26 00:00), 600, 'Device2',
    datetime(2021-04-26 00:30), 400, 'Device2',
    datetime(2021-04-26 01:30), 500, 'Device2',
    datetime(2021-04-26 01:45), 300, 'Device2'
];
let minmax=materialize(tbl | summarize mint=min(ts), maxt=max(ts));
let stime=toscalar(minmax | project mint);
let etime=toscalar(minmax | project maxt);
let dt = 1h;
tbl
| invoke time_weighted_avg_fl('ts', 'val', 'key', stime, etime, dt)
| project-rename val = tw_avg
| order by _key asc, _ts asc

출력

_ts _열쇠 val
2021-04-26 00:00:00.0000000 Device1 150
2021-04-26 01:00:00.0000000 Device1 225
2021-04-26 00:00:00.0000000 Device2 500
2021-04-26 01:00:00.0000000 Device2 400

Device1의 첫 번째 값은 (45m*100 + 15m*300)/60m = 150이고, 두 번째 값은 (15m*300 + 45m*200)/60m = 225입니다.
Device2의 첫 번째 값은 (30m*600 + 30m*400)/60m = 500이고, 두 번째 값은 (30m*400 + 15m*500 + 15m*300)/60m = 400입니다.