2017-03-31 51 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