带条件的Aggregate functions应用:每日事件数据表技术咨询
嘿,针对你这张每日驾驶事件记录表,我整理了几个实用的带条件聚合函数的实现方法,结合你的数据场景来看,直接就能用:
1. 按日期统计有效记录的总驾驶时长
注意你数据里有一条起始/结束时间为0000-00-00 00:00:00的无效记录,聚合时需要先过滤掉:
SELECT Logdate, SEC_TO_TIME(SUM(TIME_TO_SEC(Drivetime))) AS total_drivetime FROM drive_logs -- 假设你的表名为drive_logs WHERE Firstart != '0000-00-00 00:00:00' GROUP BY Logdate;
这里用TIME_TO_SEC把驾驶时长转成秒数求和,再用SEC_TO_TIME转回时间格式,避免直接对时间类型求和的精度问题。
2. 统计每日有效驾驶记录的数量
如果你需要知道每天有多少条真实的驾驶记录:
SELECT Logdate, COUNT(*) AS valid_drive_count FROM drive_logs WHERE Firstart != '0000-00-00 00:00:00' GROUP BY Logdate;
COUNT(*)会统计所有符合WHERE条件的行数,完美适配这个需求。
3. 按日期统计最长/最短驾驶时长
想知道每天单次驾驶的最长和最短耗时:
SELECT Logdate, MAX(Drivetime) AS max_drivetime, MIN(Drivetime) AS min_drivetime FROM drive_logs WHERE Firstart != '0000-00-00 00:00:00' GROUP BY Logdate;
时间类型的字段可以直接用MAX和MIN函数获取极值,非常方便。
4. 多条件聚合:统计每日驾驶时长超30分钟的总时长
如果需要更精细化的统计,比如只累加单次时长超过30分钟的记录:
SELECT Logdate, SEC_TO_TIME(SUM(CASE WHEN TIME_TO_SEC(Drivetime) > 1800 THEN TIME_TO_SEC(Drivetime) ELSE 0 END)) AS total_over_30min_drivetime FROM drive_logs WHERE Firstart != '0000-00-00 00:00:00' GROUP BY Logdate;
用CASE语句做条件判断,只对符合要求的时长进行求和,灵活应对复杂的统计规则。
5. 聚合+明细:同时查看每日总和与单条记录
如果不想丢失明细数据,又想看到每日的聚合结果,可以用窗口函数:
SELECT Logdate, Firstart, Laststop, Drivetime, SEC_TO_TIME(SUM(TIME_TO_SEC(Drivetime)) OVER (PARTITION BY Logdate)) AS daily_total FROM drive_logs WHERE Firstart != '0000-00-00 00:00:00';
OVER(PARTITION BY Logdate)会按日期分组计算总和,同时保留每条记录的详细信息,不用压缩行数。
这些方法可以根据你的实际需求调整条件,比如修改WHERE子句的过滤规则,或者调整CASE里的判断逻辑,适配不同的统计场景。
内容的提问来源于stack exchange,提问作者Tommy Sala
相关产品推荐
相关产品推荐

