2017-03-31 57 views
0


最近有人給我下面的查詢來獲取開盤價,然後找到下一個價格>開盤價。

這很好。

當然,他們正在改變我的規格。而不是使用「公開價格」,然後希望從前一天的「價格變化百分比」。

我已經有一個函數,我在下面列出調用.....但我不知道如何將它實現到查詢中。我希望有人能幫忙。
複雜查詢中的函數調用

原始查詢

SELECT MAX(price_date), MIN(open_price) KEEP (DENSE_RANK FIRST ORDER BY price_date DESC) 
FROM price_history p, master_Table m 
WHERE p.ticker = m.ticker 
AND open_price > (SELECT MIN(open_price) KEEP (DENSE_RANK FIRST ORDER BY price_date DESC) 
        FROM [email protected] p, master_table m 
        WHERE p.ticker = m.ticker 
        AND m.m_ticker = 'IBM') 
AND m.m_ticker ='IBM'; 

電話價格變化百分比功能:

PRICE_FUNCTIONS.NET_CHANGE('IBM', TRUNC(SYSDATE), 1, 'PCT') 

樣本數據:

IBM 20170330 173.86 
IBM 20170329 174.3 
IBM 20170328 173.94 
IBM 20170327 172.69 
IBM 20170324 175.12 

任何幫助將是真棒。

+0

要格式化爲'code',選擇文本,然後按CTRL' - k'或每行前添加4個空格,沒有必要添加''
顯示 –

+1

美國DB模式,樣本數據和預期的輸出。 \t請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)來了解如何提高您的問題質量並獲得更好的答案。 –

+0

@LandonStatis除了Juan的第二條評論以外,還請提供net_change函數的代碼。儘管可以將查詢中的函數合併到一起,但將邏輯直接放入sql查詢中(從而避免調用該函數所需的所有上下文切換)將會更加高效。 – Boneist

回答

0

取代您的更多信息,也許這會給您一些關於如何進行的想法?

WITH sample_data AS (SELECT 'IBM' ticker, to_date('30/03/2017', 'dd/mm/yyyy') price_date, 173.86 open_price FROM dual UNION ALL 
        SELECT 'IBM' ticker, to_date('29/03/2017', 'dd/mm/yyyy') price_date, 174.3 open_price FROM dual UNION ALL 
        SELECT 'IBM' ticker, to_date('28/03/2017', 'dd/mm/yyyy') price_date, 173.94 open_price FROM dual UNION ALL 
        SELECT 'IBM' ticker, to_date('27/03/2017', 'dd/mm/yyyy') price_date, 173.69 open_price FROM dual UNION ALL 
        SELECT 'IBM' ticker, to_date('24/03/2017', 'dd/mm/yyyy') price_date, 175.12 open_price FROM dual), 
     interim AS (SELECT ticker, 
          price_date, 
          MAX(price_date) OVER (PARTITION BY ticker) max_price_date, 
          open_price, 
          LAG(price_date) OVER (PARTITION BY ticker ORDER BY price_date) prev_price_date, 
          LAG(open_price) OVER (PARTITION BY ticker ORDER BY price_date) prev_open_price 
        FROM sample_data) 
SELECT ticker, 
     price_date, 
     open_price, 
     prev_price_date, 
     ROUND(100 * (open_price - prev_open_price)/prev_open_price, 2) percentage_change_from_yday 
FROM interim 
WHERE price_date = max_price_date; 

TICKER PRICE_DATE OPEN_PRICE PREV_PRICE_DATE PERCENTAGE_CHANGE_FROM_YDAY 
------ ----------- ---------- --------------- --------------------------- 
IBM 30/03/2017  173.86 29/03/2017       -0.25 
+0

不幸的是,我不會這件事會起作用。查詢實際上應該返回3/29,174.3 ....因爲它是從3/30開始的下一個最高。但是,下一個最高可能是任何地方.....甚至3/12 ........ –

+0

而這正是我們要求更多信息的原因。如果您無法弄清楚如何修改我的查詢以獲得您所追蹤的結果,則需要更新您的問題以添加額外信息。 – Boneist