2

我有一個對持有貨幣的交易數據與下面的模式命名trades表:選擇的時間間隔內的第一和最後一排

id  - uuid 
timestamp - timestamp without time zone 
price  - numeric 

我希望能夠在我可以建立一種查詢蠟燭圖。爲此,我需要第一價格,在最後價格,在最高價格分鐘價格,按時間間隔進行分組。到目前爲止,我有這樣的:

CREATE FUNCTION ts_round(timestamptz, INT4) RETURNS TIMESTAMPTZ AS $$ 
SELECT 'epoch'::timestamptz 
    + '1 second'::INTERVAL * ($2 * (extract(epoch FROM $1)::INT4/$2)); 
$$ LANGUAGE SQL; 

SELECT ts_round(timestamp, 300) AS interval_timestamp 
    , max(price) AS max, min(price) AS min 
FROM trades 
GROUP BY interval_timestamp 
ORDER BY interval_timestamp DESC 

如何獲得第一價格最後價格這些區間內?

+0

你是如何定義'第一價格'和'最後價格'的?按時間戳? –

+0

我嚴重懷疑你的功能是否真正滿足你的需求。它將*四捨五入至整秒後有效*截斷*至* n * - 第二個間隔。我懷疑你真的想要將***或***舍入爲* n * - 第二個間隔。對? –

+1

[給定的時間/間隔來計算每個分組數據中的開放/高/低/關閉值]的可能重複(http://stackoverflow.com/questions/27399054/given-time-interval-to-calculate-open-high - 低收入每個分組數據) – radar

回答

4

我想這是你想要的查詢:

SELECT ts_round(timestamp, 300) AS interval_timestamp, 
     max(firstprice) as firstprice, 
     max(lastprice) as lastprice, 
     max(price) AS maxprice, min(price) AS minprice 
FROM (SELECT t.*, 
      first_value(price) over (partition by ts_round(timestamp, 300) order by timestamp) as firstprice, 
      first_value(price) over (partition by ts_round(timestamp, 300) order by timestamp desc) as lastprice 
     FROM trades t 
    ) t 
GROUP BY interval_timestamp 
ORDER BY interval_timestamp DESC; 
+0

對於相同查詢級別的聚合函數的結果,可以具有窗口函數,但不能相反。儘管'min()'和'max()'可以用於任何目的,'first_value()'和'last_value()'是專用的窗口函數。這是句法**廢話**,你需要一個子查詢才能使其工作。但是,似乎並沒有讓人們投票。 –

+0

**修復後仍然不正確**。窗口框架的默認框架定義是「無界前沿和當前行之間的行」。在你的子查詢中,你有效地將* current *行的價格看作lastprice。在外部查詢中的'max(lastprice)'之後,您第二次有效地返回'max(price)',這是無稽之談。仍然不讓人們投票。 –

+0

現在它應該工作。 –

2

這將使用窗口的所有窗口的功能,並沒有子查詢。應該比目前接受的答案更快。

SELECT DISTINCT ON (1) 
     ts_round(timestamp, 300) AS interval_timestamp 
    , min(price)   OVER w AS min_price 
    , max(price)   OVER w AS max_price 
    , first_value(price) OVER w AS first_price 
    , last_value(price) OVER w AS last_price 
FROM trades 
WINDOW w AS (PARTITION BY ts_round(timestamp, 300) ORDER BY timestamp 
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
ORDER BY 1 DESC; 

要定義「第一」和「最後一個」每timestamp,則此列必須是唯一的或查詢是模糊的,從喲等於同行獲得任意選擇。

類似的答案與解釋自定義窗框:

說明由序數參考:

另外:不要使用「時間戳」作爲標識符。這是一個基本的類型名稱,容易出錯。

相關問題