Fix to consolidate avg accuracy (#753)
* The interval must fit exactly n times to the time range and query made so that the resulting avg will be exact * Add interval fix also to trend query
This commit is contained in:
@@ -3,26 +3,24 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
function historyQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {
|
function historyQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {
|
||||||
let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;
|
|
||||||
let query = `
|
let query = `
|
||||||
SELECT CAST(itemid AS CHAR) AS metric, ${time_expression} AS time_sec, ${aggFunction}(value) AS value
|
SELECT CAST(itemid AS CHAR) AS metric, MIN(clock) AS time_sec, ${aggFunction}(value) AS value
|
||||||
FROM ${table}
|
FROM ${table}
|
||||||
WHERE itemid IN (${itemids})
|
WHERE itemid IN (${itemids})
|
||||||
AND clock > ${timeFrom} AND clock < ${timeTill}
|
AND clock > ${timeFrom} AND clock < ${timeTill}
|
||||||
GROUP BY ${time_expression}, metric
|
GROUP BY (clock-${timeFrom}) DIV ${intervalSec}, metric
|
||||||
ORDER BY time_sec ASC
|
ORDER BY time_sec ASC
|
||||||
`;
|
`;
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
function trendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {
|
function trendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {
|
||||||
let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;
|
|
||||||
let query = `
|
let query = `
|
||||||
SELECT CAST(itemid AS CHAR) AS metric, ${time_expression} AS time_sec, ${aggFunction}(${valueColumn}) AS value
|
SELECT CAST(itemid AS CHAR) AS metric, MIN(clock) AS time_sec, ${aggFunction}(${valueColumn}) AS value
|
||||||
FROM ${table}
|
FROM ${table}
|
||||||
WHERE itemid IN (${itemids})
|
WHERE itemid IN (${itemids})
|
||||||
AND clock > ${timeFrom} AND clock < ${timeTill}
|
AND clock > ${timeFrom} AND clock < ${timeTill}
|
||||||
GROUP BY ${time_expression}, metric
|
GROUP BY (clock-${timeFrom}) DIV ${intervalSec}, metric
|
||||||
ORDER BY time_sec ASC
|
ORDER BY time_sec ASC
|
||||||
`;
|
`;
|
||||||
return query;
|
return query;
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ export class SQLConnector extends DBConnector {
|
|||||||
let {intervalMs, consolidateBy} = options;
|
let {intervalMs, consolidateBy} = options;
|
||||||
let intervalSec = Math.ceil(intervalMs / 1000);
|
let intervalSec = Math.ceil(intervalMs / 1000);
|
||||||
|
|
||||||
|
// The interval must match the time range exactly n times, otherwise
|
||||||
|
// the resulting first and last data points will yield invalid values in the
|
||||||
|
// calculated average value in downsampleSeries - when using consolidateBy(avg)
|
||||||
|
let numOfIntervals = Math.ceil((timeTill - timeFrom) / intervalSec);
|
||||||
|
intervalSec = (timeTill - timeFrom) / numOfIntervals;
|
||||||
|
|
||||||
consolidateBy = consolidateBy || 'avg';
|
consolidateBy = consolidateBy || 'avg';
|
||||||
let aggFunction = dbConnector.consolidateByFunc[consolidateBy];
|
let aggFunction = dbConnector.consolidateByFunc[consolidateBy];
|
||||||
|
|
||||||
@@ -66,6 +72,12 @@ export class SQLConnector extends DBConnector {
|
|||||||
let { intervalMs, consolidateBy } = options;
|
let { intervalMs, consolidateBy } = options;
|
||||||
let intervalSec = Math.ceil(intervalMs / 1000);
|
let intervalSec = Math.ceil(intervalMs / 1000);
|
||||||
|
|
||||||
|
// The interval must match the time range exactly n times, otherwise
|
||||||
|
// the resulting first and last data points will yield invalid values in the
|
||||||
|
// calculated average value in downsampleSeries - when using consolidateBy(avg)
|
||||||
|
let numOfIntervals = Math.ceil((timeTill - timeFrom) / intervalSec);
|
||||||
|
intervalSec = (timeTill - timeFrom) / numOfIntervals;
|
||||||
|
|
||||||
consolidateBy = consolidateBy || 'avg';
|
consolidateBy = consolidateBy || 'avg';
|
||||||
let aggFunction = dbConnector.consolidateByFunc[consolidateBy];
|
let aggFunction = dbConnector.consolidateByFunc[consolidateBy];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user