2012-11-12 60 views
2

我有一個包含產品,日期/時間和價格的表。我將日期/時間拆分爲另一列,我只是將其小時部分分開。我需要按小時查找價格的高/低/開/關。通過在I max()/ min()的選擇部分執行子選擇並按產品&小時加入數據,我可以輕鬆獲得高/低的容易度。我現在需要打開/關閉,這將成爲每個小時的第一個記錄和每個小時的最後一個記錄。高/低/開/關應該全部相同,每小時記錄一次。用於查找彙總值的Oracle sql子查詢

示例結果。注意所有小時7條記錄的最高值是55,所以這是所有小時7條記錄中的最高值,最低值是30,因爲它是所有小時7條記錄中最低的,50是開放的,因爲第一個價格(按日期/時間排序7時15分)50。關閉在按日期排序小時的最後價格/時間是30

Product, Date,   Hour, Price, High, Low, Open, Close 
A,  11/12/2012 7:15, 7, 50, 55, 30, 50, 30 
A,  11/12/2012 7:28, 7, 55, 55, 30, 50, 30 
A,  11/12/2012 7:30, 7, 40, 55, 30, 50, 30 
A,  11/12/2012 7:35, 7, 45, 55, 30, 50, 30 
A,  11/12/2012 7:55, 7, 30, 55, 30, 50, 30 

所以再回顧一下,高/低是很容易,因爲我在選擇部分做的子查詢該查詢針對同一個表執行max/min,但不知道如何針對打開/關閉執行相同的操作,以根據日期/時間字段獲取第一個和最後一個記錄。

+0

每小時更新設置爲定價單;)無論如何,你後到目前爲止的任何代碼,請。如果您的表格傳入記錄按時間排序。例如下午1點的第一個記錄是公開的。然後在60分鐘後,您可以檢查哪個記錄(即您的關閉)。一般來說,每個價格記號都有一個附加時間。那麼有什麼問題? :) – bonCodigo

+0

所以這是不是實時的歷史數據,所以我有全部的時間。我通過sql詢問如何獲得給定小時內所有記錄的第一個和最後一個。 例如我有:select price,(從price_tbl j選擇max(price),其中i.product = j.product和i.hr = j.hr)high from price_tbl我 我對min也是這樣做的,但是如何爲第一個和最後records.if甲骨文有第一()和最後()這將是容易的:) – user441521

回答

0

添加爲子查詢,以獲得打開,更換產品密鑰和時間適當:

SELECT * FROM (
    Select Open 
    FROM <table name> 
    WHERE product = '<product key>' 
    AND hour='<the hour>' 
    ORDER BY Date 
) WHERE rownum = 1 

添加爲子查詢,以獲得關閉,適當地更換產品密鑰和小時:

SELECT * FROM (
    Select Close 
    FROM <table name> 
    WHERE product = '<product key>' 
    AND hour='<the hour>' 
    ORDER BY Date desc 
) WHERE rownum = 1 

這裏的訣竅是正確設置排序結果,並僅使用第一個結果rownum = 1


另一種選擇:

SELECT Open 
FROM <table name> 
WHERE product = '<product key>' 
    AND hour='<the hour>' 
    AND Date = (
    SELECT min(Date) 
    FROM <table name> 
    WHERE product = '<product key>' 
    AND hour='<the hour>' 
    ) 

SELECT Close 
FROM <table name> 
WHERE product = '<product key>' 
    AND hour='<the hour>' 
    AND Date = (
    SELECT max(Date) 
    FROM <table name> 
    WHERE product = '<product key>' 
    AND hour='<the hour>' 
    ) 

這條路線的缺點是,這些聲明不能保證返回一行。這意味着如果給定產品在同一小時內有兩個條目,並且具有與最小/最大值相同的Date值,則它將返回2行,在用作子查詢時會導致異常。

儘管這可能是一件好事,而不是隨便挑選一行,您會知道存在一個特定問題,並且可能更新查詢以做出更明智的決定。

+0

看到我認爲rownum計算之前,按順序by從句,如果它在同一個查詢,並在那一點上是'保證以任何特定的順序。所以這意味着我不得不子查詢它,而這是行不通的,因爲在select語句中,你不能嵌套2並使用最外層表的連接。這就是問題出現的地方。 – user441521

+0

我很確定順序會先完成。尋找一個參考。同時你是否嘗試過運行它? –

+0

你是對的,它的順序是在'rownum'之後完成的,你必須包裝它。 [ORACLE SQL ROWNUM執行順序](http://stackoverflow.com/questions/3019853/oracle-sql-rownum-execution-order)。唯一的其他選項仍然仍然有2個訂閱,基本上使用日期列的最小值和最大值。如果你想我可以發佈它,但我認爲它比上面更糟糕。 –

0

我會用排序功能是:

select product, datestr, hour, 
     max(case when seqnum_open = 1 then price end) as Open, 
     max(case when seqnum_close = 1 then price end) as Close, 
     max(price) as High, 
     min(price) as Low 
from (select t.*, 
      row_number() over (partition by product, datestr, hour order by date) as seqnum_open, 
      row_number() over (partition by product, datestr, hour order by date desc) as seqnum_close 
     from (select t.*, 
        to_char(date, 'YYYY-MM-DD') as datestr 
      from t 
      ) t 
    ) t 
group by product, datestr, hour