【发布时间】:2011-12-23 15:45:33
【问题描述】:
我正在使用 PostgreSQL 数据库进行时间聚合的 Java 实现。
我的桌子是这样的
Value | Start | Stop
(int) | (Date) | (Date)
-------------------------------
1 | 2004-01-01 | 2010-01-01
4 | 2000-01-01 | 2008-01-01
所以要形象化这个时期:
------------------------------
----------------------------------------
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
[ 4 ][ 5=4+1 ][ 1 ]
我的算法现在计算数据的时间聚合,例如总和():
Value | Start | Stop
-------------------------------
4 | 2000-01-01 | 2004-01-01
5 | 2004-01-01 | 2008-01-01
1 | 2008-01-01 | 2010-01-01
为了测试获得的结果,我现在想直接使用 PostgreSQL 查询数据。我知道这个问题还没有简单的方法。但是,肯定有一种方法可以获得相同的结果。应支持聚合 Count、Max、Min、Sum 和 Average。我不介意一个糟糕或缓慢的解决方案,它只需要工作。
到目前为止,我发现的一个应该类似的查询如下:
select count(*), ts, te
from ( checkout a normalize checkout b using() ) checkoutNorm
group by ts, te;
我的收养是这样的:
select count(*), start, stop
from ( myTable a normalize myTable b using() ) myTableNorm
group by start, stop;
但是报错ERROR: syntax error at or near "normalize" -- LINE 2: from ( ndbs_10 a normalize ndbs_10 b using() ) ndbsNorm。
有没有人可以解决这个问题?它不必基于上述查询,只要它有效。非常感谢。
【问题讨论】:
-
你的计算对我来说没有意义。我没有看到任何逻辑方法可以从 {1, 2004-01-01, 2010-01-01} 和 {4, 2000-01-01} 派生 {4, 2000-01-01, 2004-01-01} , 2008-01-01}。我一定是错过了什么。
-
表示从2000年到2004年(不包括)SUM(值)为4。从2004年到2008年(不包括)有两个时期重叠,所以它们的值应该加以总结。现在有意义吗?
-
什么特别对你没有意义?想象一张包含工人工资(每行一个)和他们受雇时期的表格。现在的结果应该是每个时期的总工资(或最大值、最小值、平均值、计数)。
-
哪个版本的 PostgreSQL,哪个时间模块?
-
它是 x86_64-pc-linux-gnu 上的 PostgreSQL 8.4.8,由 GCC gcc-4.4.real (Debian 4.4.5-8) 4.4.5 编译,64 位,没有已知的时间补充。这在我无法更新的服务器上运行,但我可以使用本地数据库。
标签: postgresql aggregate-functions aggregation temporal-database