1

问题描述:我正在尝试为从查询生成的每组行定义一个接收一组行并返回一组行的 pl/python 聚合器。输入的行集应该是在查询中使用 group by 语句生成的组。我试图通过语法找到自己的方式,但我很难做到这一点。欢迎使用 pl/pgsql 函数,但恐怕它们可能缺乏执行此操作的表达能力。

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

这是创建表的方式:

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

在这里,您可以找到一个 Java 示例(伪代码),该示例显示了在按股票代码排序后应如何处理组(按天分组)。在 Java 中,这些组表示为 ArrayList,因为它们按股票排序,相同的位置对应于相同的股票(数据库在生成时检查,因此不会丢失任何记录)并且由于它们按天分组,因此每个组的值同一天和第二天比上一次通话。

PD:我还在pl/pgsql 中添加了计算 MACD 的代码,但为此我按股票和日期排序,我想按天排序并在循环中对所有股票代码进行所有计算,因为那应该效率更高,特别是考虑到最终输出必须按天订购才能以这种方式消耗。

如果有任何不完全清楚的地方,请问我,我正在努力做到简洁明了。

非常感谢你。

4

2 回答 2

1

抱歉,如果描述令人困惑。我解决了我面临的问题:

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

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

于 2012-03-02T13:44:53.080 回答
0

既然我已经看过你想要做的事情,我会在黑暗中拍摄。

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

只是为您提供一些“堆栈溢出”提示...给我们列名作为“值”或“日期”而不是您的实际列名或忽略表名导致我们只能提供像上面那样的愚蠢伪代码不会' t 直接在您的数据库中工作。将来,请给我们您的表名和列……最好是表创建语句。

所以上面的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' ;)

于 2012-01-30T20:30:46.227 回答