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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:10:29