1105 - errCode = 2, detailMessage = update_time, pm25, pm25_level not in aggregate's outputSELECT date_format(update_time, '%Y-%m') AS time, json_array(JSON_OBJECT( 'air_value', pm25, 'air_level', pm25_level, 'air_time', update_time )) AS daily FROM dc_dwb_air_daily_city_air_data WHERE update_time BETWEEN ' 2022-01-01' AND '2022-12-31' AND region_key = '423d19490' GROUP BY time
时间: 2025-06-10 19:02:55 浏览: 19
<think>好的,用户这次遇到了另一个Doris查询的错误,错误信息是“1105 - errCode = 2, detailMessage = update_time, pm25, pm25_level not in aggregate's output”。看起来用户已经根据之前的建议修改了引号问题,并尝试使用JSON_OBJECT,但依然存在新的问题。需要仔细分析错误信息。
首先,错误提示中的“not in aggregate's output”说明在聚合查询中,SELECT列表中的某些列没有在GROUP BY子句中出现,也没有被聚合函数处理。Doris的SQL模式可能比较严格,特别是在启用only_full_group_by的情况下,要求所有非聚合列必须出现在GROUP BY子句中。
用户当前的查询是:
SELECT date_format(update_time, '%Y-%m') AS time,
json_array(JSON_OBJECT( 'air_value', pm25, 'air_level', pm25_level, 'air_time', update_time )) AS daily
FROM dc_dwb_air_daily_city_air_data
WHERE update_time BETWEEN ' 2022-01-01' AND '2022-12-31' AND region_key = '423d19490'
GROUP BY time;
这里,GROUP BY子句使用了别名time,而time是date_format(update_time, '%Y-%m')的别名。问题出在SELECT中的pm25、pm25_level和update_time这些字段没有在GROUP BY中出现,也没有被聚合函数包裹,导致Doris无法确定如何聚合这些值。
可能用户希望按月份分组,但每个月份内可能有多条数据,需要明确如何处理这些非聚合列。比如,是否需要取平均值、最大值,或者确保每个月份只有一条数据。如果数据是按天或更细粒度存储的,同一个月份可能有多个记录,这时候直接选择pm25等字段会导致歧义。
此外,用户可能误解了JSON_OBJECT的作用,以为可以将多个行数据合并成一个JSON数组。但实际上,在没有聚合的情况下,JSON_ARRAY可能只是将单行的数据包装成数组,而不是合并多行。因此,可能需要使用聚合函数如JSON_ARRAYAGG来合并多行数据,但需要确认Doris是否支持该函数。
接下来需要检查的几个方面:
1. GROUP BY的正确性:确保所有SELECT中的非聚合列都在GROUP BY中,或者使用聚合函数处理。
2. JSON函数的支持情况:Doris可能不支持原生的JSON_OBJECT或JSON_ARRAYAGG,需要寻找替代方法。
3. 数据聚合逻辑:用户是否希望每个月份对应多个pm25记录,如果是,可能需要使用GROUP_CONCAT或类似的函数来合并数据。
解决方案可能包括:
- 将pm25、pm25_level和update_time添加到GROUP BY中,但这可能导致分组过细,不符合用户按月聚合的预期。
- 对这些字段使用聚合函数,如MAX、MIN、AVG等,取决于业务需求。
- 如果用户希望将同一月份的所有记录合并成一个JSON数组,可能需要使用GROUP_CONCAT配合字符串拼接,或者使用Doris支持的JSON聚合函数。
另外,注意到WHERE子句中update_time的条件有一个前导空格在' 2022-01-01',这可能导致日期解析问题,需要修正为'2022-01-01'。
最后,可能需要再次提醒用户关于Doris对JSON函数的支持情况,以及正确的聚合查询写法,确保所有非聚合列都被正确处理。</think>让我们逐步解决这个Doris查询错误:
**核心错误分析:**
`update_time, pm25, pm25_level not in aggregate's output` 表示:
- 当启用`only_full_group_by`模式时(Doris默认严格模式)
- `SELECT`中的非聚合字段必须满足以下条件之一:
1. 出现在`GROUP BY`子句中
2. 被聚合函数包裹(如MAX/SUM等)
3. 是GROUP BY字段的函数推导字段
**当前SQL问题诊断:**
```sql
SELECT
date_format(update_time, '%Y-%m') AS time, -- ✅ GROUP BY字段的表达式
json_array(JSON_OBJECT(
'air_value', pm25, -- ❌ 未聚合且不在GROUP BY
'air_level', pm25_level, -- ❌ 同上
'air_time', update_time -- ❌ 同上(且与GROUP BY粒度不同)
)) AS daily
...
GROUP BY time
```
**解决方案一:严格模式调整(不推荐)**
临时关闭严格模式(生产环境慎用):
```sql
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';
```
**解决方案二:标准SQL改写(推荐)**
```sql
SELECT
date_format(update_time, '%Y-%m') AS time,
-- 使用MAX聚合函数(假设需要最新记录)
JSON_ARRAY(
JSON_OBJECT(
'air_value', MAX(pm25),
'air_level', MAX(pm25_level),
'air_time', MAX(update_time)
)
) AS daily
FROM dc_dwb_air_daily_city_air_data
WHERE
update_time BETWEEN '2022-01-01' AND '2022-12-31' -- 注意修正前导空格
AND region_key = '423d19490'
GROUP BY date_format(update_time, '%Y-%m'); -- 推荐使用原表达式而非别名
```
**解决方案三:多记录聚合(进阶)**
若需要合并每月多条记录(Doris 2.0+):
```sql
SELECT
date_format(update_time, '%Y-%m') AS time,
CONCAT(
'[',
GROUP_CONCAT(
CONCAT(
'{"air_value":', pm25,
',"air_level":"', pm25_level,
'","air_time":"', update_time, '"}'
)
SEPARATOR ','
),
']'
) AS daily
FROM dc_dwb_air_daily_city_air_data
WHERE
update_time BETWEEN '2022-01-01' AND '2022-12-31'
AND region_key = '423d19490'
GROUP BY date_format(update_time, '%Y-%m');
```
**关键修改点说明:**
1. **日期条件修正**:
```sql
-- 原错误写法(包含前导空格):
BETWEEN ' 2022-01-01' AND '2022-12-31'
-- 修正后:
BETWEEN '2022-01-01' AND '2022-12-31'
```
2. **JSON函数兼容性**:
Doris目前(2.0.3版本):
- ✅ 支持`JSON_ARRAY`
- ❌ 不支持`JSON_OBJECTAGG`(需手动拼接)
- ⚠️ `JSON_ARRAY(JSON_OBJECT(...))` 实际等价于单元素数组
3. **聚合策略选择**:
| 聚合方式 | 适用场景 | 示例 |
|--------------|-----------------------------|--------------------------|
| MAX() | 取最新/最大记录 | 空气质量峰值统计 |
| AVG() | 计算月平均值 | PM2.5月均浓度 |
| GROUP_CONCAT | 保留所有原始记录(需注意长度限制) | 生成完整数据清单 |
**执行计划优化建议:**
1. **分区检查**:
```sql
SHOW PARTITIONS FROM dc_dwb_air_daily_city_air_data;
```
确保`update_time`是分区字段以提高查询效率
2. **索引利用**:
```sql
SHOW INDEX FROM dc_dwb_air_daily_city_air_data;
```
确认`region_key`是否有索引加速
3. **数据验证查询**:
```sql
-- 检查是否存在2022年数据
SELECT COUNT(*)
FROM dc_dwb_air_daily_city_air_data
WHERE update_time BETWEEN '2022-01-01' AND '2022-12-31'
AND region_key = '423d19490';
-- 验证字段类型
DESC dc_dwb_air_daily_city_air_data;
```
**最终验证SQL:**
```sql
SELECT
date_format(update_time, '%Y-%m') AS time,
JSON_ARRAY(
JSON_OBJECT(
'air_value', MAX(pm25),
'air_level', MAX(pm25_level),
'air_time', MAX(update_time)
)
) AS daily
FROM dc_dwb_air_daily_city_air_data
WHERE
update_time BETWEEN '2022-01-01' AND '2022-12-31'
AND region_key = '423d19490'
GROUP BY date_format(update_time, '%Y-%m')
LIMIT 10;
```
**预期输出示例:**
```
time | daily
2022-03 | [{"air_value": 42, "air_level": "良", "air_time": "2022-03-15 08:00:00"}]
2022-04 | [{"air_value": 35, "air_level": "优", "air_time": "2022-04-22 12:00:00"}]
```
**可能延伸问题处理:**
1. **时区问题**:
```sql
-- 显式指定时区
date_format(CONVERT_TZ(update_time, '+00:00', '+08:00'), '%Y-%m')
```
2. **空值处理**:
```sql
COALESCE(pm25, 0) -- 将NULL替换为0
IFNULL(pm25_level, '未知')
```
3. **性能优化**:
```sql
-- 添加前缀索引(若region_key是高频过滤条件)
ALTER TABLE dc_dwb_air_daily_city_air_data
ADD INDEX idx_region (region_key) USING INVERTED;
```
阅读全文
相关推荐



















