java - 在 Java 或 C++ 等编程语言中有效地模拟 SQL group by 子句,而不是求助于 RDBMS

标签 java c++ sql

我想对上传的文件执行动态 SQL GROUP BY。我不想先将文件存储在数据库中,然后再执行该子句,因为这对我的需要来说太耗时了。

我可以在 Java 或 C++ 中使用的高效算法是什么?最好是 C++。

提前感谢您的任何想法和答案。

最佳答案

最简单的方法可能是只对您在 SQL 的 group by 子句中使用的字段上的数据进行排序。

分组比排序有更宽松的约束,因此理论上它可能比排序快一点,但除非您处理大量数据,否则您不太可能看到速度差异。

当您使用 SQL 的汇总功能时,最大的区别就来了。例如,select x, count(x) from wherever, group by x 将显示 x 的每个值以及每个值的计数。对于这样的功能,您通常会在 C++ 中使用 std::mapstd::unordered_map,或者使用 HashMapTreeMap 在 Java 中。

编辑:

对于一个真正微不足道的例子,让我们考虑一个相当简单的 group-by 子句的结果,我们需要计算不同年份出生的人数。我们将从这样的原始数据开始:

last-name<tab>first-name<tab>height<tab>birth-year

所以(例如)我将被编码为:

Coffin\tJerry\t70\t1964

在 SQL 中,我们可能会使用:

select birth_year, count(birth_year) 
    from people
    group by birth_year
    order by birth_year

对于 C++ 中的粗略等效代码,我们可能会编写如下代码:

struct person { 
    std::string last_name;
    std::string first_name;
    int height;
    int birth_year;
};

我们会从这样的文件中读取关于一群人的数据:

 std::ifstream in("people.txt");
 std::vector<person> people((std::istream_iterator<person>(in)),
                             std::istream_iterator<person>());

然后我们会像这样收集我们关心的数据:

std::map<int, int> year_counts;

for ( auto &p : people)
    ++year_counts[p.birth_year];

然后我们可以像这样打印出数据:

std::cout << "Year\tCount\n";
for (auto c : year_counts)
    std::cout << c.first << "\t" << c.second << "\n";

关于java - 在 Java 或 C++ 等编程语言中有效地模拟 SQL group by 子句,而不是求助于 RDBMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16425840/

相关文章:

java - 具有 blob 的文件中的多个成员

mysql - SQL 连接重复结果

java - 如何使用 log4j 记录器在 eclipse 的控制台输出中显示 java 程序的结果?

java - 如何使用 java8 在字符串中查找第一个重复和不重复的字符

c++ - 用复利计算总返回

c++ - 无符号和有符号类型的相等操作数行为

java - 连接关闭不会关闭Tomcat中的连接

java - ORA-12704 : character set mismatch when performing multi-row INSERT of nullable NVARCHAR's

java - 用 Java 构建 SOAP 客户端

c++ - 线程读锁定与写锁定