如何实现时间段筛选?如何查询24小时内完成行程的最高数量?
针对小时级时间戳表格的三类需求实现方案
1. 时间段筛选
直接通过WHERE子句对时间戳字段进行范围过滤,示例SQL(假设表名为trip_data,时间戳字段为timestamp_hour):
SELECT * FROM trip_data WHERE timestamp_hour BETWEEN '2023-10-01 00:00:00' AND '2023-10-07 23:00:00';
如果是业务系统中动态传入起止时间,建议使用参数化查询避免SQL注入风险。
2. 查询连续y小时内的x值
假设x是需要统计的数值字段(如里程、时长等),分两种场景实现:
- 实时滑动窗口统计:用窗口函数计算每个时间点往前y小时内的x值汇总(以求和为例):
SELECT timestamp_hour, x, SUM(x) OVER (ORDER BY timestamp_hour RANGE BETWEEN INTERVAL 4 HOUR PRECEDING AND CURRENT ROW) AS continuous_4h_x_total FROM trip_data;
将4 HOUR替换为你需要的y HOUR即可。
- 枚举所有连续y小时区间:通过自连接生成所有可能的连续y小时区间,并统计区间内的x值:
SELECT t1.timestamp_hour AS interval_start, t1.timestamp_hour + INTERVAL y HOUR AS interval_end, SUM(t2.x) AS interval_x_total FROM trip_data t1 JOIN trip_data t2 ON t2.timestamp_hour >= t1.timestamp_hour AND t2.timestamp_hour < t1.timestamp_hour + INTERVAL y HOUR GROUP BY t1.timestamp_hour;
3. 找出24小时内完成行程的最高数量
方法1:窗口函数实现(推荐,效率更高)
先按小时统计行程数,再用滑动窗口计算24小时滚动总和,最后取最大值:
WITH hourly_trip_counts AS ( SELECT timestamp_hour, COUNT(trip_id) AS hourly_trip_num FROM trip_data GROUP BY timestamp_hour ), rolling_24h_stats AS ( SELECT timestamp_hour, SUM(hourly_trip_num) OVER (ORDER BY timestamp_hour RANGE BETWEEN INTERVAL 23 HOUR PRECEDING AND CURRENT ROW) AS rolling_24h_trips FROM hourly_trip_counts ) SELECT MAX(rolling_24h_trips) AS max_24h_trip_count FROM rolling_24h_stats;
方法2:自连接实现(兼容不支持窗口函数的老版本数据库)
SELECT COUNT(t2.trip_id) AS max_24h_trip_count FROM trip_data t1 JOIN trip_data t2 ON t2.timestamp_hour >= t1.timestamp_hour AND t2.timestamp_hour < t1.timestamp_hour + INTERVAL 24 HOUR GROUP BY t1.timestamp_hour ORDER BY max_24h_trip_count DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者OranC
相关产品推荐
相关产品推荐

