- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 ArrayList<Map<String, Object>>
其中有数据库表之类的数据。我想自己计算小计 Java 成员的总计。可以通过 GroupBY Rollup/Cube 在 SQL 中实现相同的功能。我写了一个函数来计算 GroupBy Cube。
public static List<Map<String, Object>> applyGroupBy(List<LevelDetail> dimensionColumns, List<MeasureDetail> numericColumns, List<Map<String, Object>> resultset) {
List<Map<String, Object>> resultsetNew = new ArrayList<Map<String, Object>>();
Map<String, List<Double>> grandTotalMap = new HashMap<String, List<Double>>();
for (LevelDetail levelDetail : dimensionColumns) {
Stream<Map<String, Object>> stream = resultset.stream();
stream.collect(Collectors.groupingBy(m -> m.get(levelDetail.getName()), LinkedHashMap::new, Collectors.mapping(m -> m, Collectors.toList()))).forEach((g, r) -> {
Map<String, Object> row = new HashMap<String, Object>();
row.put(levelDetail.getName(), g);
for (MeasureDetail measureDetail : numericColumns) {
DoubleStream valueStream = r.stream().mapToDouble(p -> {
p.put(levelDetail.getName() + "_nb_grouping", 0);
resultsetNew.add(p);
return Double.parseDouble(p.get(measureDetail.getName()) != null ? p.get(measureDetail.getName()).toString() : "0");
});
Double value = getAggregatedResult(valueStream, measureDetail.getMeasure_rollup_expr());
row.put(measureDetail.getName(), value);
if (dimensionColumns.indexOf(levelDetail) == 0) {
if (!grandTotalMap.containsKey(measureDetail.getName())) {
grandTotalMap.put(measureDetail.getName(), new ArrayList<Double>());
}
grandTotalMap.get(measureDetail.getName()).add(value);
}
}
row.put(levelDetail.getName() + "_nb_grouping", 0);
for (LevelDetail ld : dimensionColumns) {
if (!ld.getName().equals(levelDetail.getName())) {
row.put(ld.getName() + "_nb_grouping", 1);
row.put(ld.getName(), null);
}
}
resultsetNew.add(row);
});
}
Map<String, Object> row = new HashMap<String, Object>();
for (LevelDetail levelDetail : dimensionColumns) {
row.put(levelDetail.getName(), null);
row.put(levelDetail.getName() + "_nb_grouping", 1);
}
for (MeasureDetail measureDetail : numericColumns) {
Double value = getAggregatedResult(grandTotalMap.get(measureDetail.getName()).stream().mapToDouble((i) -> (Double) i), measureDetail.getMeasure_rollup_expr());
row.put(measureDetail.getName(), value);
}
resultsetNew.add(row);
resultset = new ArrayList<Map<String, Object>>(new LinkedHashSet<Map<String, Object>>(resultsetNew));
resultsetNew.clear();
resultsetNew.addAll(resultset);
return resultsetNew;
}
private static final String AVG = "avg";
private static final String MIN = "min";
private static final String MAX = "max";
private static Double getAggregatedResult(DoubleStream ds, String agg) {
switch (agg.toLowerCase()) {
case AVG:
return ds.average().getAsDouble();
case MIN:
ds.min().getAsDouble();
case MAX:
ds.max().getAsDouble();
default:
return ds.sum();
}
}
我想写一个按 Rollup 分组的方法。无论是按 Rollup 还是按 Cube 分组,都可以参数化为相同的功能。
最佳答案
当使用不如商业软件强大的免费软件 SGBD 时,有时必须在 Java 代码中实现某些功能。汇总似乎是多维数据集查询的一个子集。因此,要获得汇总,您必须从多维数据集查询中删除一些行和一些部分总计。在具体情况下,这可能相当容易,但概括起来可能需要一些时间才能准确发现应删除哪些行以及哪种算法可以在每种情况下执行它。
关于java - 在 Java 中模拟 Group By Rollup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302279/
以这张表为例(我们称之为BIN_TABLE): +------+------+ | A | B | +------+------+ | 0 | 0 | | 0 |
我的Rollup项目是这样的... // rollup.config.js import pkg from "./package.json"; import {getRollupServerConfi
每当我为生产而构建时,都会收到此警告。当我为生产而构建时,我在汇总输出配置中禁用了源映射。 output: [{ dir: "...", format: "...", sourcemap: isPro
1、Rollup 概述 官网地址:https://rollupjs.org/guide/en/ Rollup 是什么 我们先看看 Rollup 的作者 Rich Harr
我想使用现在可用的 vuejs3 测试版设置一个项目。我想把它编译成es模 block ,所以我不能使用webpack。 是否有可用的种子项目/指南来设置带有汇总的 vue3 以发出 es 模块包
在SQL Server中使用ROLLUP时,如何获取明细行上方的小计行? 这是您在使用 ROLLUP 时通常会得到的结果: Group Name
我在我的 repo 的某些文件中导入了一个绝对路径,并尝试将它与 rollup 捆绑在一起 我的导入,其中/api/是绝对路径: import * from '/api/myFile.js' 但是当我
我正在使用 ES6 导入并使用 Rollup 进行编译。 输出是单个捆绑文件。 可以将 Rollup 配置为生成文件对文件的转译结果吗? 这是我正在使用的当前配置,它显然会吐出一个文件。 gulp.
我对打包机和 rollup 还很陌生具体来说。在 rollup.config.js 中有条件地散列文件名的最佳方法是什么?在为生产构建时,同时保存 index.html引用新 .css和 .js散列版
我使用 group by 和 rollup 得到以下查询结果: Divison Department Section Employee Name Employee ID Hour
我有这个sql查询 Select Case When transfer.trf_type = 'c' then 'Transfer to own card' When transf
今天在这个问题上停留了一段时间,想知道有人能提出问题出在哪里吗?这是我的代码: select g.game_name, r.rental_id, sum(if(datediff(r.return_da
Mytable,其 ID 作为自动增量客户、日期和金额我想做一个汇总,将每个客户每天的金额相加我的意思是汇总按日期和客户分组我的结果应该是这样的: +---------+--------------+
我有一个 SQL 语句,它给出了工作债权人的列表。在图像中的示例中,两个债权人都属于同一份工作。所以在显示 TOTALS 的最后一行,作业数是 1,这是正确的,因为它是同一个作业。同样,表示 NotP
+----+-------+-------+ | id | style | color | +----+-------+-------+ | 1 | 1 | red | | 2 |
我正在尝试向我的 SELECT 查询中添加一些总计,但我正在努力了解为什么这不起作用: SELECT 客户,job_type,actual_value_fee FROM jo2细节 GROUP BY
下面是我正在写的查询,但由于某种原因,它在“ROLLUP”一词之后给我一个语法错误,红色的小波浪线在汇总后的“(”下面。 SELECT building, room_number, time_slot
我想将一个 .js 文件与 rollup 捆绑在一起,其中只有一个类定义。但汇总仅创建一个空的捆绑文件。当我在类定义之外添加一些代码时,这种情况会发生变化。这将创建一个空包: class MyElem
这是我的例子(mysql Ver 14.14 Distrib 5.7.21,适用于 Win64 (x86_64)) DROP TABLE IF EXISTS t_tt; CREATE TEMPORAR
当按多个字段分组时执行 WITH ROLLUP,MySQL 返回每个组的汇总行,以及总体摘要: CREATE TABLE test (name VARCHAR(50), number TINYINT)
我是一名优秀的程序员,十分优秀!