2012-01-30 86 views
1

问题描述:我试图定义一个pl/python聚合器,它接收一组行并返回一组行,对于从一组行生成的每一行查询。输入的行集应该是使用查询中的group by语句生成的组。我试图通过语法找到自己的方式,但我很难与之相媲美。 pl/pgsql函数是受欢迎的,但恐怕他们可能缺乏表达能力来做到这一点。pl/python接收和输出一组行

上下文描述:我有一个三列的表:行情符号,日期和值。我试图根据我的价值计算每个股票代码和日期的macd。我可以按日期对表格进行分组和排序,然后我需要做的就是每个组根据每个ticker的当前值和聚合器的前一个值计算该日期的聚合器值,我猜想将存储在SD中,那么我必须返回的是一组具有该值的行,并且可能是进行连接的代码行,但我认为应该可以保留顺序并节省连接时间。

这是怎样的表将被创建:

create table candles(ticker text, day date, value real, 
    primary key (ticker, day)); 

Here you can find an example in Java(伪-ISH),显示了如何基团(按天组)应当处理由股票排序之后。在Java中,这些组被表示为一个ArrayList,因为它们按行情排序,同一位置对应同一个行情(数据库在生成时进行检查,因此没有记录丢失),并且由于它们按天分组,因此每个组都具有与前一次通话相同的一天和第二天。

PD:我也添加了code to calculate MACD in pl/pgsql,但是为了这个我通过ticker和day命令,我希望按天排序并对循环中的所有代码进行所有计算,因为这应该更有效率,特别是考虑到最终产量必须按照这种方式按天使用。

如果有什么不完全清楚的问题,请问我,我试图说清楚和简洁。

非常感谢。

回答

1

对不起,如果描述很混乱。我解决了我面临的问题:

  1. 从我想通过使用子查询进行分组的值创建数组。 select array_agg(x) from y group by z order by v;
  2. 创建一个接受数组的函数,只需在参数描述中添加[]即可。并为该功能的聚合器。
  3. 在最终查询中使用聚合器和子查询。

这很容易,但我不知道数组类型及其所有可能性。对不起,谢谢。

0

现在我已经看过你想要做的事情了,我会在黑暗中拍摄一张照片。

Select symbol, value 
from a_table_with_three_columns 
where date = '2012-01-05' 

只是一些“堆栈溢出”的技巧你...给我们列名作为“价值”或代替实际列名还是忽视表名的结果我们只能够给傻“日期”上面的伪代码不会直接在你的数据库中工作。将来,给我们你的表名和列...最好是表格创建语句。

所以上面的sql会给你所有的记录和它们在当天的价值。 (我假设你的数据是一天而不是小时隙)。现在,我们可以采取的查询和它加入到自己除了前一天:

select a.symbol, a.value - b.value 
(Select symbol, value 
from a_table_with_three_columns 
where date = '2012-01-05') a 
inner join 
(Select symbol, value 
from a_table_with_three_columns 
where date = '2012-01-05')b 
on a.symbol = b.symbol 

这会给你的符号列表,并在两天值之间的差异。稍作修改,您可以在datediff函数上进行此连接,并将日期作为数据集的一部分。这将返回符号,日期和前一天的值的差异。我也可以指导你完成这个部分,不过我会从你自己那里获得更好的模式数据,所以我不需要使用'a_table_with_three_columns';)

+0

Pseudocode是好的,我的同事们用西班牙语不断开发代码(不要让我开始),所以它不会在我的数据库上工作,但我可以自己生成伪代码。我在OP中添加了这些信息和更多信息。谢谢。 – Trylks 2012-01-31 12:06:40