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

如何编写SQL查询筛选combination_table中travel_time高于平均值的segment_ids?

实现需求的SQL方案

当然可以!这里有几种实用的写法来完成你想要的操作——先计算travel_time的平均值,再筛选出travel_time高于该平均值的segment_id,不同写法适配不同场景,你可以按需选择:

方法1:子查询直接计算平均值

这是最直观简单的写法,先在子查询里算出整体的travel_time平均值,再在外层查询中筛选出符合条件的记录:

SELECT segment_id
FROM combination_table
WHERE travel_time > (SELECT AVG(travel_time) FROM combination_table);

说明:这种写法兼容性极强,几乎所有主流数据库(MySQL、PostgreSQL、SQL Server、Oracle等)都支持,适合逻辑简单的场景。

方法2:使用CTE(公共表表达式)

如果后续需要扩展查询逻辑,CTE能让代码结构更清晰易读。先定义一个CTE存储平均值,再基于它进行筛选:

WITH avg_travel_stats AS (
    SELECT AVG(travel_time) AS avg_time
    FROM combination_table
)
SELECT c.segment_id
FROM combination_table c
CROSS JOIN avg_travel_stats a
WHERE c.travel_time > a.avg_time;

说明:CTE支持PostgreSQL、SQL Server、MySQL 8.0+、Oracle 12c+等版本,可读性更好,适合复杂查询的场景。

方法3:使用窗口函数(适合需保留更多字段的场景)

如果你不仅需要筛选segment_id,还想同时查看每条记录的travel_time和整体平均值,窗口函数是个不错的选择:

SELECT segment_id
FROM (
    SELECT 
        segment_id,
        travel_time,
        AVG(travel_time) OVER() AS overall_avg_time
    FROM combination_table
) AS subquery
WHERE travel_time > overall_avg_time;

说明:窗口函数会为每条记录添加上整体的travel_time平均值,外层再做筛选。这种方式适合需要展示更多关联数据的场景,主流数据库的新版本都支持。

额外注意事项

  • 如果travel_time存在NULL值,AVG()函数会自动忽略这些值,无需额外处理;如果需要将NULL视为特定值(比如0),可以用COALESCE(travel_time, 0)替换原字段。
  • 对于超大规模的表,方法1和方法2的性能通常更优,因为它们只计算一次平均值;窗口函数的话,数据库优化器一般也会做优化,你可以通过查看执行计划来确认。

内容的提问来源于stack exchange,提问作者Twister Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:07:43