time_weighted_avg_fl()
Funkce time_weighted_avg_fl()
je uživatelem definovaná funkce , která vypočítá časově vážený průměr metriky v daném časovém intervalu v rámci vstupních časových intervalů. Tato funkce je podobná operátoru summarize. Funkce agreguje metriku podle časových intervalů, ale místo výpočtu jednoduchého avg() hodnoty metriky v každé přihrádce váhá každou hodnotu podle doby trvání. Doba trvání je definována od časového razítka aktuální hodnoty do časového razítka další hodnoty.
Tento typ agregace se vyžaduje pro případy použití, kdy se hodnoty metrik generují jenom při změně (a ne v konstantních intervalech). Například v IoT, kde hraniční zařízení odesílají metriky do cloudu pouze při změnách a optimalizují šířku pásma komunikace.
Syntax
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 | Typ | Vyž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 obsahujícího klíč oddílu záznamů. |
čas stime | datetime |
✔️ | Počáteční čas okna agregace. |
etime | datetime |
✔️ | Koncový čas okna agregace. |
Dt | timespan |
✔️ | Časový interval agregace |
Definice funkce
Funkci můžete definovat vložením jejího kódu jako funkce definované dotazem nebo jejím vytvořením jako uložené funkce v databázi, a to 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 nelze spustit samostatně. Musí za ním následovat příkaz tabulkového výrazu. Pokud chcete spustit funkční příklad , podívejte se na time_weighted_avg_fl()
příklad.
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 timestamp = column_ifexists(t_col, datetime(null)), value = column_ifexists(y_col, 0.0), key = column_ifexists(key_col, '');
let gridTimes = range timestamp from stime to etime step dt | extend value=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 timestamp between (stime..etime)
| partition hint.strategy=native by key (
order by timestamp asc, value nulls last
| scan declare(f_value:real=0.0) with (step s: true => f_value = iff(isnull(value), s.f_value, value);) // fill forward null values
| extend diff_t=(next(timestamp)-timestamp)/1m
)
| where isnotnull(diff_t)
| summarize tw_sum=sum(f_value*diff_t), t_sum =sum(diff_t) by bin_at(timestamp, dt, stime), key
| where t_sum > 0
| 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, vyvolejte 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 timestamp = column_ifexists(t_col, datetime(null)), value = column_ifexists(y_col, 0.0), key = column_ifexists(key_col, '');
let gridTimes = range timestamp from stime to etime step dt | extend value=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 timestamp between (stime..etime)
| partition hint.strategy=native by key (
order by timestamp asc, value nulls last
| scan declare(f_value:real=0.0) with (step s: true => f_value = iff(isnull(value), s.f_value, value);) // fill forward null values
| extend diff_t=(next(timestamp)-timestamp)/1m
)
| where isnotnull(diff_t)
| summarize tw_sum=sum(f_value*diff_t), t_sum =sum(diff_t) by bin_at(timestamp, dt, stime), key
| where t_sum > 0
| 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), 200, 'Device1',
datetime(2021-04-26 01:06), 100, 'Device1',
datetime(2021-04-26 00:30), 400, 'Device2',
datetime(2021-04-26 01:00), 100, 'Device2',
datetime(2021-04-26 02:00), 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, timestamp asc
Výstup
časové razítko | key | Val |
---|---|---|
2021-04-26 00:00:00.0000000 | Zařízení 1 | 125 |
2021-04-26 01:00:00.0000000 | Zařízení 1 | 110 |
2021-04-26 00:00:00.0000000 | Zařízení 2 | 200 |
2021-04-26 01:00:00.0000000 | Zařízení 2 | 100 |
První hodnota je (45m*100 + 15m*200)/60m = 125, druhá hodnota je (6m200 + 54m100)/60m = 110 atd.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro