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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:42:11