У меня есть SQL-запрос, который берет среднее значение в секундах между каждым датой и временем и группирует его по интервалу/10 (чтобы иметь меньшую точность для группировки, я думаю) и вернуть интервал с наибольшим количеством случаев.
Я хотел бы сделать то же самое в javascript, но это кажется сложным. Не могли бы вы помочь мне ? Я добавил sql в запрос и образец данных, чтобы понять больше во фрагменте.
Спасибо
const p_table = [{
"datetime": "2014-11-01 06:52:22.39"
},
{
"datetime": "2014-11-01 06:53:03.13"
},
{
"datetime": "2014-11-01 06:54:04.23"
},
{
"datetime": "2014-11-01 06:57:27.92"
},
{
"datetime": "2014-11-01 06:59:09.76"
},
{
"datetime": "2014-11-01 07:01:32.33"
},
{
"datetime": "2014-11-01 07:02:32.33"
},
{
"datetime": "2014-11-01 07:03:32.33"
},
{
"datetime": "2014-11-01 07:04:32.33"
},
{
"datetime": "2014-11-01 16:54:03.13"
},
{
"datetime": "2014-11-01 16:56:03.13"
},
{
"datetime": "2014-11-01 16:57:03.13"
}
];
/*
SELECT @Interval = AVG(DATEDIFF(Second,p1.DateTime,p2.DateTime))
FROM P_table p1, P_table p2
AND p2.Datetime > p1.Datetime
GROUP BY DATEDIFF(Second,p1.DateTime,p2.DateTime)/10
HAVING Count(*)=MAX(Count(*))
*/
// If I understood the query well the output should be around 60s, as we have 8 time an interval of approx 60s & 1 time an interval of 3600s+
// WIP
var helper = {};
// Count each time an interval occur in values
for (var i = 1; i < p_table.length; i++) {
var d1 = new Date(p_table[i].datetime);
var d2 = new Date(p_table[i - 1].datetime)
var curr_interval_millis = d1 - d2;
var curr_interval_seconds = curr_interval_millis / 1000;
var key = Math.floor(curr_interval_seconds / 10) * 10; // We group by dozen of seconds and then put it back
if (!helper[key]) helper[key] = 1;
else helper[key] += 1;
}
console.info("Count each time an interval occur in values")
console.info(helper);
// Get the interval that occur the most often
var maxKey = -1;
var maxCount = 0;
Object.keys(helper).forEach(key => {
var currMaxCount = helper[key];
if (currMaxCount > maxCount) {
maxKey = key;
maxCount = currMaxCount;
}
});
console.info("max", maxKey, helper[maxKey])
// multiply this interval with the number of lines to have approximate monitoring time per 24h /12h
Вывод должен быть: 60
🤔 А знаете ли вы, что...
JavaScript можно использовать для создания видеоигр, как 2D, так и 3D, с использованием библиотеки Three.js.
Как видите в теме:
// WIP
var helper = {};
// Count each time an interval occur in values
for (var i = 1; i < p_table.length; i++) {
var d1 = new Date(p_table[i].datetime);
var d2 = new Date(p_table[i - 1].datetime)
var curr_interval_millis = d1 - d2;
var curr_interval_seconds = curr_interval_millis / 1000;
var key = Math.floor(curr_interval_seconds / 10) * 10; // We group by dozen of seconds and then put it back
if (!helper[key]) helper[key] = 1;
else helper[key] += 1;
}
console.info("Count each time an interval occur in values")
console.info(helper);
// Get the interval that occur the most often
var maxKey = -1;
var maxCount = 0;
Object.keys(helper).forEach(key => {
var currMaxCount = helper[key];
if (currMaxCount > maxCount) {
maxKey = key;
maxCount = currMaxCount;
}
});
console.info("max", maxKey, helper[maxKey])