#!/usr/bin/env php modify("-{$days} days")->format('Y-m-d H:i:s'); echo "Backfilling server_metrics_trends for the last {$days} days...\n"; echo "Range start: {$rangeStart}\n"; $sql = " INSERT INTO server_metrics_trends ( server_id, metric_name_id, period_start, avg_value, min_value, max_value, count_samples ) SELECT sm.server_id, sm.metric_name_id, DATE_FORMAT(sm.created_at, '%Y-%m-%d %H:00:00') AS period_start, AVG(CAST(sm.value AS DECIMAL(20,4))) AS avg_value, MIN(CAST(sm.value AS DECIMAL(20,4))) AS min_value, MAX(CAST(sm.value AS DECIMAL(20,4))) AS max_value, COUNT(*) AS count_samples FROM server_metrics sm INNER JOIN metric_names mn ON mn.id = sm.metric_name_id WHERE sm.created_at >= :range_start AND mn.name NOT IN ('top_cpu_proc', 'top_ram_proc') GROUP BY sm.server_id, sm.metric_name_id, DATE_FORMAT(sm.created_at, '%Y-%m-%d %H:00:00') ON DUPLICATE KEY UPDATE avg_value = VALUES(avg_value), min_value = VALUES(min_value), max_value = VALUES(max_value), count_samples = VALUES(count_samples), created_at = NOW() "; $stmt = $pdo->prepare($sql); $stmt->execute([':range_start' => $rangeStart]); $duration = (new DateTime())->getTimestamp() - $startedAt->getTimestamp(); echo "Done in {$duration} sec.\n";