我在postgres表格中有以下表格中的数据:
Col1 Col2 Col3 Col4
id1 a b c
id2 id1 timeBegin 1###-##-##
id2 id1 timeEnd 22##-##-##
id3 id4 id5 id6
id6 id3 timeBegin 2##-##-##
id7 id3 timeEnd 200-3-##
id13 id8 id14 id15
id8 id9 timeBegin -2-1-1
id10 id11 id12 id13
这里1###-#-##-#####-####-#####-###-####
而22#-#-##-##-###-###-###-###-###-###-##
2##-#-##-###-####-###-##-###-###-###
而200-3-##意味着从(200-3-01到200-3-31)时间上的不确定性
20-3-##意味着从(20-3-01到20-3-31)时间上的不确定性
200-3-###意味着从(200-3-01到200-3-31)时间上的不确定性
和-200-3-####################
现在,我要将col1==col2的3行合并为以下形式之一:
^{pr2}$如果未给出col1==col2的timeEnd,则认为9999-12-12为timeEnd
如果未给出col1==col2的timeBegin,则假定01-01-01为timeBegin
也就是说,我想在合并时取timeBegin的最小值和timeEnd的最大值。在
是否可以在postgres中执行此join操作。i、 我可以把它写成SQL连接查询吗?在
如果我也能用python这样的编程语言(以高效的方式)实现所需的功能:那就太好了。在
这个问题实际上有两个部分。一个对应于正确对齐表的数据。另一种是处理日期格式的混乱。在
现在假设有两个sql函数begin_time()和end_time()。我马上在下面讨论。在
要对齐数据,请将表与自身左联接两次:
如果由于存在多个条目而产生多个条目,请使用聚合:
^{pr2}$注意:如果您有大量的数据,那么上面的操作不会特别好。在create表中运行它们一次。。。语句并删除原始架构,或创建一个物化视图以供将来使用。在
然后,您需要考虑如何格式化混乱的timeBegin和timeEnd字段,我假设它们存储在文本字段中。会是这样的:
如果您对它比较熟悉,可以选择使用plpython或plpythonu。我想您对这两个方面的了解要比我多,而且肯定有足够的python来编写所需的代码。劳伦斯的代码是另一个很好的起点,如果您更愿意使用plpgsql。在
strict
语句告诉Postgres不要在空输入上调用函数,而是立即返回null。您可能不希望它用于结束时间函数。在下面的方法使用单个SQL
SELECT
和CASE
语句,这些语句通过后处理子查询来应用规则。可能还有进一步的调整,但它给出了总体思路。很抱歉这很复杂-一开始只是基于帖子中的规则,但是已经被修改以处理一般的情况,结果发现非常复杂!在已知的限制:这种方法目前不能很好地处理闰年,并且假设2月的最后一天总是28日,这样做是安全的。这是可以修复的,但闰年的计算并不是完全微不足道的,所以我慎重地将这一点省略掉,以免过于复杂。在
这是一个SQL Fiddle Demo,它显示它产生的结果与发布的示例相似。在
我不相信这是最好的方法,但是这里有两个Postgres函数,它们完成了将模式转换为最短日期和最长日期这一难题:
{>
这已经经历了足够多的迭代,可以使用一些重构
相关问题 更多 >
编程相关推荐