我想对上传的文件执行动态 SQL GROUP BY。我不想先将文件存储在数据库中,然后再执行该子句,因为这对我的需要来说太耗时了。
我可以在 Java 或 C++ 中使用的高效算法是什么?最好是 C++。
提前感谢您的任何想法和答案。
最佳答案
最简单的方法可能是只对您在 SQL 的 group by
子句中使用的字段上的数据进行排序。
分组比排序有更宽松的约束,因此理论上它可能比排序快一点,但除非您处理大量数据,否则您不太可能看到速度差异。
当您使用 SQL 的汇总功能时,最大的区别就来了。例如,select x, count(x) from wherever, group by x
将显示 x
的每个值以及每个值的计数。对于这样的功能,您通常会在 C++ 中使用 std::map
或 std::unordered_map
,或者使用 HashMap
或 TreeMap
在 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/