1#include "core/aqm_db.h"
5void generate_statistics(
void) {
7 if (aqm_db_open(&db) != 0)
10 sqlite3_stmt *res = NULL;
12 "SELECT r.sensor_id, s.name, r.model, "
13 "AVG(r.pm25), MAX(r.pm25), MIN(r.pm25), "
14 "AVG(r.pm10), MAX(r.pm10), MIN(r.pm10), "
15 "AVG(r.co), MAX(r.co), MIN(r.co), "
16 "AVG(r.no2), MAX(r.no2), MIN(r.no2), "
17 "AVG(r.o3), MAX(r.o3), MIN(r.o3), "
18 "AVG(r.so2), MAX(r.so2), MIN(r.so2), "
20 "FROM readings r JOIN sensors s ON s.id = r.sensor_id "
21 "GROUP BY r.sensor_id, s.name, r.model "
22 "ORDER BY r.sensor_id, r.model;";
24 if (sqlite3_prepare_v2(db, sql, -1, &res, NULL) != SQLITE_OK) {
25 fprintf(stderr,
"Query failed: %s\n", sqlite3_errmsg(db));
30 printf(
"\n--- Aggregated statistics by sensor ---\n");
32 while (sqlite3_step(res) == SQLITE_ROW) {
33 int sid = sqlite3_column_int(res, 0);
34 const char *name = (
const char *)sqlite3_column_text(res, 1);
35 const char *model = (
const char *)sqlite3_column_text(res, 2);
36 double count = sqlite3_column_double(res, 21);
38 printf(
"\nSensor %d (%s) model=%s — samples: %.0f\n", sid, name ? name :
"", model ? model :
"", count);
39 printf(
" PM2.5 avg %.4f max %.4f min %.4f\n", sqlite3_column_double(res, 3),
40 sqlite3_column_double(res, 4), sqlite3_column_double(res, 5));
41 printf(
" PM10 avg %.4f max %.4f min %.4f\n", sqlite3_column_double(res, 6),
42 sqlite3_column_double(res, 7), sqlite3_column_double(res, 8));
43 printf(
" CO avg %.4f max %.4f min %.4f\n", sqlite3_column_double(res, 9),
44 sqlite3_column_double(res, 10), sqlite3_column_double(res, 11));
45 printf(
" NO2 avg %.6f max %.6f min %.6f\n", sqlite3_column_double(res, 12),
46 sqlite3_column_double(res, 13), sqlite3_column_double(res, 14));
47 printf(
" O3 avg %.6f max %.6f min %.6f\n", sqlite3_column_double(res, 15),
48 sqlite3_column_double(res, 16), sqlite3_column_double(res, 17));
49 printf(
" SO2 avg %.6f max %.6f min %.6f\n", sqlite3_column_double(res, 18),
50 sqlite3_column_double(res, 19), sqlite3_column_double(res, 20));
53 sqlite3_finalize(res);