Sdílet prostřednictvím


time_weighted_avg_fl()

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Funkce time_weighted_avg_fl() je uživatelem definovaná funkce (UDF), která vypočítá časový vážený průměr metriky v daném časovém intervalu v intervalech vstupního času. Tato funkce je podobná operátoru sumarizace. Funkce agreguje metriku podle časových intervalů, ale místo výpočtu jednoduchého prům.() hodnoty metriky v každé přihrádce váží každou hodnotu podle doby trvání. Doba trvání je definována z časového razítka aktuální hodnoty do časového razítka další hodnoty.

Existují dvě možnosti pro výpočet časového váženého průměru. Tato funkce vyplní hodnotu od aktuálního vzorku až do další. Alternativně time_weighted_avg2_fl() lineárně interpoluje hodnotu metriky mezi po sobě jdoucími vzorky.

Syntaxe

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

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
t_col string ✔️ Název sloupce obsahujícího časové razítko záznamů.
y_col string ✔️ Název sloupce obsahujícího hodnotu metriky záznamů.
key_col string ✔️ Název sloupce, který obsahuje klíč oddílu záznamů.
stime datetime ✔️ Počáteční čas okna agregace.
etime datetime ✔️ Koncový čas okna agregace.
Dt timespan ✔️ Interval času agregace.

Definice funkce

Funkci můžete definovat vložením jejího kódu jako funkce definovanou dotazem nebo vytvořením jako uložené funkce v databázi následujícím způsobem:

Definujte funkci pomocí následujícího příkazu let. Nejsou vyžadována žádná oprávnění.

Důležité

Příkaz let nemůže běžet samostatně. Musí následovat příkaz tabulkového výrazu. Pokud chcete spustit funkční příklad, podívejte se na příkladtime_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.

Příklad

Následující příklad používá operátor invoke ke spuštění funkce.

Pokud chcete použít funkci definovanou dotazem, vyvoláte ji po definici vložené funkce.

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

Výstup

_ts _klíč Val
2021-04-26 00:00:00.0000000 Zařízení 1 150
2021-04-26 01:00:00.0000000 Zařízení 1 225
2021-04-26 00:00:00.0000000 Zařízení 2 500
2021-04-26 01:00:00.0000000 Zařízení 2 400

První hodnota zařízení1 je (45m*100 + 15m*300)/60m = 150, druhá hodnota je (15m*300 + 45m*200)/60m = 225.
První hodnota zařízení2 je (30m*600 + 30m*400)/60m = 500, druhá hodnota je (30m*400 + 15m*500 + 15m*300)/60m = 400.