SQL查询求助:获取id_unit总数及经纬度平均值失败
问题分析与解决方案
你的嵌套SQL无法生效的核心问题是子查询存在语法错误:子查询中SELECT du.id_unit,但GROUP BY的是du.freq_int, pos.lat, pos.lon,而id_unit既不在GROUP BY列表中,也没有用聚合函数包裹,这不符合SQL的分组规则(PostgreSQL等严格模式下会直接报错)。
根据你的需求(获取id_unit总数、纬度和经度平均值),分两种场景给出正确写法:
场景1:统计去重的id_unit总数 + 所有符合条件记录的经纬度平均值
如果是要统计所有满足条件的唯一id_unit数量,同时计算对应所有记录的经纬度平均值,直接用单查询聚合即可:
SELECT COUNT(DISTINCT du.id_unit) AS total_unique_id_units, AVG(pos.lat) AS average_latitude, AVG(pos.lon) AS average_longitude FROM xtu.dash($__timeFrom()::timestamp, $__timeTo()::timestamp) du INNER JOIN flt_lst_geo() pos ON pos.sdes = du.plate WHERE du.freq_int IS NOT NULL AND du.freq_int > 45
场景2:保留原分组逻辑后统计总数与平均值
如果你原本的GROUP BY是为了去除(freq_int, lat, lon)的重复组合,再基于这些分组后的记录统计总数和平均,需要先修正子查询的语法(给id_unit加聚合函数,比如MAX或MIN,或者确保id_unit与分组列函数依赖),再在外层聚合:
SELECT COUNT(tm.id_unit) AS total_grouped_id_units, AVG(tm.lat) AS average_latitude, AVG(tm.lon) AS average_longitude FROM (SELECT -- 用聚合函数包裹id_unit,符合GROUP BY规则 MAX(du.id_unit) AS id_unit, du.freq_int, pos.lat, pos.lon FROM xtu.dash($__timeFrom()::timestamp, $__timeTo()::timestamp) du INNER JOIN flt_lst_geo() pos ON pos.sdes = du.plate WHERE du.freq_int IS NOT NULL AND du.freq_int > 45 GROUP BY du.freq_int, pos.lat, pos.lon) AS tm
关键说明
- 场景1是最常见的需求,无需分组直接聚合即可得到准确的去重id_unit数量和整体经纬度平均。
- 场景2仅在你明确需要基于
(freq_int, lat, lon)分组后再统计时使用,此时子查询必须保证SELECT的列要么在GROUP BY中,要么被聚合函数处理。
内容的提问来源于stack exchange,提问作者JAOdev
相关产品推荐
相关产品推荐

