2012-01-30 82 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