2009-07-15 113 views
6

我已经编写了一些非常基本的工具,用于对来自非数据库源(例如:CSV,OLTP系统)的数据集进行分组,旋转,联合和小计。 “group by”方法是大多数方法的核心。“分组依据”和其他数据库算法?

但是我确定很多工作已经完成,为分组数据做了高效的算法......我确信我没有使用它们。而我的Google-fu完全没有把任何东西变成什么。

有没有很好的在线资源或书籍描述更好的方法来创建分组数据?

或者我应该开始看一下MySQL源代码或类似的东西?

+0

我敢打赌,你已经完成了优化,但是Wes McKinney写了一些关于他是如何通过他的Pandas图书馆中的问题来解决问题的:http://wesmckinney.com/blog/mastering-high -performance-data-algorithms-i-group-by/ – DGrady 2017-06-08 21:03:46

回答

5

一个非常方便的方式来“组合”一些字段(或一组字段和表达式,但我会使用“字段”为简单起见! - )是当您可以安排在分组之前走过结果(RBG )以一种排序的方式 - 你实际上不关心排序(除了ORDER BY也在那里并且恰好与GROUP BY!在同一个字段中的常见情况 - ),而是关于排序的“副作用”属性 - RBG中与分组字段具有相同值的所有行都紧挨着排列,因此您可以积累,直到分组字段发生变化,然后发出/产生迄今积累的结果,并且继续使用新行(具有不同分组字段值的行)重新初始化累加器 - 确保在刚开始的时候“只是初始化累加器”,并且在最后结束时“仅发出/产生累积结果” , 当然。

如果这不起作用,也许你可以散列分组字段,并使用散列表为该组累积的结果 - 在RBG的每一行中,散列分组字段,检查它是否已经存在作为散列表中的关键字,如果不是在那里用从RBG行适当初始化的累加器来存储它,否则更新每个RBG行的累加器。最后你放弃一切。问题当然是你要占用更多内存直到结束!)

这些是两种基本方法。你想每个都需要伪代码,BTW?

+0

谢谢亚历克斯,这些完全合理,我使用第一个。你知道这个领域有什么好的算法吗?或者这只是个人体验? – 2009-07-16 00:15:30

+0

对不起,基本上是个人经验 - 从一个人不得不自己实现这些事情(在ISAM之上或诸如早期的bsd-db之类的事情),因为轻量级嵌入式SQL引擎不存在或非常昂贵(现在我当我需要嵌入式引擎时,倾向于使用SQLite ;-)。 – 2009-07-16 01:46:04

+0

好点Alex,我看过SQLlite,看起来不错。回想起来,我似乎已经实现了相同的解决方案,从C和Perl到VBA的各种语言:) – 2009-07-17 02:25:10

1

您应该检查出OLAP数据库。 OLAP允许您创建一个旨在以“切片和切块”方式分析的聚合数据库。

使用OLAP数据库可以通过任意维度快速分析诸如计数,平均值,分钟数,最大值,总和和stdev等聚合度量。

请参阅this在MSDN上的OLAP简介。

0

举一个CSV文件和结果类型的例子,我可能会为你制作一个Python解决方案。

Python有CSV模块和列表/发生器的理解,可以帮助这种事情。

  • 稻田。