问题描述:我正在尝试定义一个pl / python聚合器,它接收一组行并为查询生成的每组行返回一组行。输入的行集应该是在查询中使用group by语句生成的组。我试图通过语法找到自己的方式,但我很难用。 pl / pgsql函数是受欢迎的,但我担心它们可能缺乏表达能力。
上下文描述:我有一个包含三列的表:股票代码,日期和值。我正在尝试根据我的值计算每个股票代码和日期的macd。我可以按日期对表进行分组和排序,然后我要做的就是每个组根据每个股票代码的当前值和聚合器的先前值计算该日期的聚合器的值,我想我将存储在SD中,然后我必须返回的是具有该值的一组行,并且可能是用于进行连接的自动收报机,但我认为应该可以保留订单并节省连接的时间。
这就是表格的创建方式:
create table candles(ticker text, day date, value real,
primary key (ticker, day));
Here you can find an example in Java(pseudocode-ish),显示在按自动收报机排序后应如何处理组(按日分组)。在Java中,这些组表示为ArrayList,因为它们按自动收报机排序,相同的位置对应于相同的自动收报机(数据库在生成时检查,因此没有记录丢失),并且由于它们按天分组,因此每个组都具有以下值:与前一次通话相同的第二天和第二天。
PD:我还添加了code to calculate MACD in pl/pgsql,但是为了这个,我通过自动收报机和日期订购,我想按天订购并对循环中的所有代码进行所有计算,因为那应该更有效率,特别是考虑到最终输出必须按天排序以便以这种方式消费。如果有任何不完全清楚的地方请问我,我想要清楚简明。
非常感谢。
答案 0 :(得分:1)
很抱歉,如果说明令人困惑。我解决了我面临的问题:
select array_agg(x) from y group by z order by v;
[]
添加到参数说明中即可。以及该功能的聚合器。这很简单,但我不知道阵列类型及其所有可能性。对不起,谢谢。
答案 1 :(得分:0)
我会在黑暗中拍摄,因为我已经看过你要做的事了。
Select symbol, value
from a_table_with_three_columns
where date = '2012-01-05'
给你一些'堆栈溢出'提示...给我们列名称为'value'或'date'而不是你的实际列名或忽略表名导致我们只能给出如上所述的愚蠢的伪代码这不会直接在您的数据库中工作。将来,给我们你的表名和列...最好是表create语句。
因此,上面的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';)