如何在TimeScaleDB/PostgreSQL中合并car与van的统计结果?
问题:合并SQL查询中指定枚举值的统计结果
原执行的SQL查询:
SELECT time_bucket('60 min', raw_data.timestamp) AS time_60min, COUNT(raw_data.vehicle_class) AS "count", raw_data.vehicle_class AS "vehicle_class" FROM bma_raw_data_ode AS raw_data WHERE raw_data.vehicle_class IN ('car', 'bus', 'van', 'motorbike') GROUP BY time_60min, raw_data.vehicle_class ORDER BY time_60min
raw_data.vehicle_class为枚举类型,包含12种可选值(如car、bus、person、bicycle等)。
当前查询返回结果示例:
"2025-06-10 19:00:00+00" 1 "bus" "2025-06-10 19:00:00+00" 4 "motorbike" "2025-06-10 19:00:00+00" 126 "car" "2025-06-10 19:00:00+00" 3 "van"
需求:将每小时的car和van统计结果合并为一行,得到如下格式:
"2025-06-10 19:00:00+00" 1 "bus" "2025-06-10 19:00:00+00" 4 "motorbike" "2025-06-10 19:00:00+00" 129 "car + van"
解决方案:使用CASE WHEN调整分组逻辑
不需要虚拟表连接,直接通过修改SELECT和GROUP BY中的分组字段即可实现,核心是用CASE WHEN把car和van映射为同一个分组标签,其他类型保持原样,再按新的标签分组统计。
修改后的SQL:
SELECT time_bucket('60 min', raw_data.timestamp) AS time_60min, COUNT(raw_data.vehicle_class) AS "count", CASE WHEN raw_data.vehicle_class IN ('car', 'van') THEN 'car + van' ELSE raw_data.vehicle_class::TEXT END AS "vehicle_class" FROM bma_raw_data_ode AS raw_data WHERE raw_data.vehicle_class IN ('car', 'bus', 'van', 'motorbike') GROUP BY time_60min, CASE WHEN raw_data.vehicle_class IN ('car', 'van') THEN 'car + van' ELSE raw_data.vehicle_class::TEXT END ORDER BY time_60min
说明:
CASE WHEN语句将car和van统一替换为car + van,其他枚举值转换为文本类型保持原名称(避免枚举类型与字符串的类型冲突)。GROUP BY子句与SELECT中的分组逻辑完全一致,数据库会按照新标签分组统计,自动合并car和van的数量。- 这种方法无需额外表连接,直接在原查询基础上修改,执行效率更高。
内容的提问来源于stack exchange,提问作者PhilippR
相关产品推荐
相关产品推荐

