You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Google Charts中按日期聚合传感器数据的重复行问题

解决Google Charts数据行重复问题

我正尝试从MySQL服务器获取传感器记录,需将数据格式化为Google Charts所需的data.addRows格式。当前PHP代码生成的图表行每个日期重复三次,而需求是每个日期仅显示一行,格式如[new Date(2025, 0, 1), 394, 432, 434]。

数据结构

sensorID | sensorValue | sensorDate
1 | 394 | 2025-01-01 00:01:00
2 | 432 | 2025-01-01 00:01:10
3 | 434 | 2025-01-01 00:01:15
1 | 405 | 2025-01-02 00:01:00
2 | 416 | 2025-01-02 00:01:10
3 | 328 | 2025-01-02 00:01:15
2 | 428 | 2025-01-03 00:01:10
1 | 421 | 2025-01-03 00:01:15
3 | 301 | 2025-01-03 00:01:20

原查询语句

$result0 = mysqli_query($conn, "SELECT DISTINCT sensorID, DATE_FORMAT(sensorDate, '%Y-%m-%d') as sensorDate_change, sensorValue FROM sensorRecords ORDER BY sensorDate, sensorID") ;

解决方案

1. 调整SQL查询,按日期聚合传感器数据

原查询返回的是每个传感器的单日独立记录,导致日期重复。使用条件聚合将同一日期的所有传感器值合并到一行:

SELECT
    DATE_FORMAT(sensorDate, '%Y-%m-%d') as sensorDate,
    MAX(CASE WHEN sensorID = 1 THEN sensorValue END) as sensor1,
    MAX(CASE WHEN sensorID = 2 THEN sensorValue END) as sensor2,
    MAX(CASE WHEN sensorID = 3 THEN sensorValue END) as sensor3
FROM sensorRecords
GROUP BY DATE_FORMAT(sensorDate, '%Y-%m-%d')
ORDER BY sensorDate;

注:由于单日每个传感器仅一条记录,用MAX/MIN/AVG均可,目的是取出对应传感器的唯一值。

2. PHP代码生成Google Charts格式数据

循环处理查询结果,将日期转换为Google Charts兼容的new Date()格式,组装成目标数组结构:

// 执行调整后的SQL查询
$result0 = mysqli_query($conn, "SELECT DATE_FORMAT(sensorDate, '%Y-%m-%d') as sensorDate, MAX(CASE WHEN sensorID = 1 THEN sensorValue END) as sensor1, MAX(CASE WHEN sensorID = 2 THEN sensorValue END) as sensor2, MAX(CASE WHEN sensorID = 3 THEN sensorValue END) as sensor3 FROM sensorRecords GROUP BY DATE_FORMAT(sensorDate, '%Y-%m-%d') ORDER BY sensorDate");

$rows = [];
while ($row = mysqli_fetch_assoc($result0)) {
    // 拆分日期,注意Google Charts月份从0开始,需减1
    list($year, $month, $day) = explode('-', $row['sensorDate']);
    $datePart = "new Date({$year}, " . ($month - 1) . ", {$day})";
    // 组装单条记录
    $rows[] = "[{$datePart}, {$row['sensor1']}, {$row['sensor2']}, {$row['sensor3']}]";
}

// 输出最终的data.addRows格式
echo "data.addRows([\n" . implode(",\n", $rows) . "\n]);";

处理后每个日期仅生成一行数据,完全符合[new Date(2025, 0, 1), 394, 432, 434]的要求。


内容的提问来源于stack exchange,提问作者Gregory Munson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:03:14