如何在SQLite中为每个item添加对应max和min值的额外列?
解决SQLite中按分组添加min/max列的问题
你之前的查询语句无法得到期望结果,主要有两个问题:
- 未指定分组逻辑却直接使用聚合函数
MAX()/MIN(),SQLite会将全表作为一个分组返回单行汇总结果,而非保留原表的每一行数据。 - 字段名写错:
min(val)中的val应为表中实际存在的value字段。
针对你的需求,这里提供两种在SQLite中可行的实现方式:
方法一:使用窗口函数(推荐,SQLite 3.25及以上版本支持)
窗口函数可以在不压缩原表行数的前提下,按指定分组计算聚合值,语法简洁高效:
SELECT item, value, MIN(value) OVER (PARTITION BY item) AS min_val, MAX(value) OVER (PARTITION BY item) AS max_val FROM ask;
其中PARTITION BY item表示按item字段分组,对每个分组单独计算value的最小值和最大值,并将结果匹配到原表的每一行。
方法二:使用关联子查询(兼容旧版本SQLite)
如果你的SQLite版本不支持窗口函数,可以通过关联子查询实现,对每一行数据单独查询对应item的聚合值:
SELECT a.item, a.value, (SELECT MIN(value) FROM ask WHERE item = a.item) AS min_val, (SELECT MAX(value) FROM ask WHERE item = a.item) AS max_val FROM ask a;
这里通过别名a引用主表的每一行,子查询根据item匹配对应的分组,返回该分组的min和max值。
以上两种方法都能得到你期望的结果:
| item | value | min_val | max_val |
|---|---|---|---|
| A | 1 | 1 | 4 |
| A | 4 | 1 | 4 |
| A | 3 | 1 | 4 |
| B | 0 | 0 | 1 |
| B | 1 | 0 | 1 |
| C | 2 | 2 | 4 |
| C | 4 | 2 | 4 |
内容的提问来源于stack exchange,提问作者szaki
相关产品推荐
相关产品推荐

