JQuick-SQL GROUP BY 聚合:COUNT、SUM、AVG、MIN 与 MAX
Meta 描述:使用 jquick-sql 的 GROUP BY 和 COUNT、SUM、AVG、MIN、MAX 汇总注册数据集,学习分组列、聚合别名和 Java 嵌入式执行案例。
标签:jquick-sql、GROUP BY、SQL 聚合、COUNT、SUM、AVG、轻量级 SQL 引擎、Java 跨库查询
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-sql
- github 地址:https://github.com/paohaijiao/jquick-sql
前言
GROUP BY 将明细行分为业务分组,聚合函数则计算每组的计数、求和、均值或极值。jquick-sql 作为 Java 分布式 SQL 查询引擎,可在进程内对应用已注册的数据集执行这些语义;外部数据连接与抽取仍应由上游负责。
分组列与聚合函数
项目支持 COUNT、SUM、AVG、MIN、MAX。SELECT 中的非聚合字段应进入 GROUP BY,并为聚合结果设置容易识别的别名:
sql
SELECT status,
COUNT(*) AS user_count,
AVG(age) AS avg_age,
MIN(age) AS min_age,
MAX(age) AS max_age
FROM users
GROUP BY status
聚合运算建立在注册时声明的 Java 类型之上;金额、数量等字段应使用合适的数值类型。
汇总后排序与过滤
聚合结果可继续 ORDER BY,并可用 HAVING 过滤分组:
sql
SELECT status, COUNT(age) AS count, AVG(age) AS avg_age
FROM users
GROUP BY status
HAVING COUNT(age) > 1
ORDER BY count DESC
WHERE 和 HAVING 的职责不同:WHERE 过滤分组前明细,HAVING 过滤聚合后分组。
面向异构数据的聚合边界
异构数据源联邦查询需要先把来自文件、接口或其他存储的数据转换成统一的 JQuickColumnMeta 和 JQuickRow。jquick-sql 不会以 JDBC 直连方式拉取这些数据,但可以对已注册数据集提供统一的聚合 SQL。
可执行 Java 案例
java
import com.github.paohaijiao.engine.JQuickSQL;
import com.github.paohaijiao.statement.JQuickColumnMeta;
import com.github.paohaijiao.statement.JQuickDataSet;
import com.github.paohaijiao.statement.JQuickRow;
import java.util.Arrays;
public class GroupByAggregationDemo {
public static void main(String[] args) {
JQuickSQL sql = JQuickSQL.embedded();
try {
sql.registerTable("sales", Arrays.asList(
new JQuickColumnMeta("city", String.class, "sales"),
new JQuickColumnMeta("amount", Double.class, "sales")
), Arrays.asList(
row("city", "Beijing", "amount", 1200.0),
row("city", "Beijing", "amount", 800.0),
row("city", "Shanghai", "amount", 1500.0)
));
JQuickDataSet result = sql.execute(
"SELECT city, COUNT(*) AS order_count, SUM(amount) AS total_amount, AVG(amount) AS avg_amount " +
"FROM sales GROUP BY city ORDER BY total_amount DESC"
);
result.printTable();
} finally {
sql.shutdown();
}
}
private static JQuickRow row(Object... kv) {
JQuickRow r = new JQuickRow();
for (int i = 0; i < kv.length; i += 2) r.put((String) kv[i], kv[i + 1]);
return r;
}
}
常见问题
**COUNT(*) 与 COUNT(age) 如何选择?**前者计数分组行,后者以指定列参与计数,按业务含义选择。
**为什么金额用 Double.class?**示例遵循项目测试类型;真实金额精度策略应由业务模型统一。
**聚合前能先筛选吗?**可以,在 GROUP BY 前使用 WHERE。
总结与拓展
GROUP BY 把注册数据集压缩为可解释的业务指标,是离线统计、服务内分析和 Java 跨库查询结果汇总的重要能力。将类型和字段语义在接入阶段统一,可显著提升汇总稳定性。
Core Advantage
Built-in aggregation turns registered rows into concise group-level metrics.
Applicable Scenarios
Operational dashboards, status statistics, local rollups, and connector-normalized analytics.