簡體   English   中英

如何提取當前和過去一個月的數據SQL Server

[英]How to pull current and past month data SQL Server

我需要列出交易日期,一年中每個月的股票收盤價(我將其稱為“當前”月)和“當前”月前一個月的股票收盤價。

我正在使用的StockData表具有每個交易日期和股票代碼的日期,股票高,低,開盤,收盤和交易量列。

最初,我使用AVG

SELECT 
    YEAR(TradeDate) AS Year, 
    MONTH(TradeDate) AS Month, 
    TickerSymbol, 
    AVG(ST_Close) AS CurrentClose,
    LAG (AVG(ST_Close), 1, 0) OVER (ORDER BY TickerSymbol, YEAR(TradeDate), MONTH(TradeDate), TickerSymbol) AS PreviousMonthClose,
FROM 
    StockData
WHERE
    TradeDate >= '2000-01-01' AND ST_Close IS NOT NULL
GROUP BY 
    YEAR(TradeDate), MONTH(TradeDate), TickerSymbol
ORDER BY 
    YEAR(TradeDate), MONTH(TradeDate), TickerSymbol;

但是,我不想使用平均值,而是想將股票的收盤價從每個月的最后一天以及上個月的前一天的最后一天拉下來(對於2010年4月,我想顯示4月30日的收盤價,2010年和2010年3月31日)

有關如何執行此操作的任何想法?

您可以使用窗口函數和條件聚合:

SELECT sd.*
FROM (SELECT sd.*, 
             ROW_NUMBER() OVER (PARTITION BY TickerSymbol, YEAR(TradeDate), MONTH(TradeDate)
                                ORDER BY TradeDate DESC) as seqnum
      FROM StockData sd
      WHERE TradeDate >= '2000-01-01' AND ST_Close IS NOT NULL
     ) sd
WHERE seqnum = 1
ORDER BY TradeDate, TickerSymbol;

這將從每個月的最新記錄中獲取所有信息。

按年份排序(交易日期),月份(交易日期),TickerSymbol;

以下是一種方法,該方法假定您需要的上一個收盤價是從上個月股票最后交易的日期起。

WITH
    daily_close AS (
        SELECT  
            TradeDate
          , TickerSymbol
          , ST_Close
          , ROW_NUMBER() OVER(PARTITION BY TickerSymbol, EOMONTH(TradeDate) ORDER BY TradeDate DESC) AS day_num
        FROM    dbo.StockData
        WHERE   TradeDate >= '2012-01-01'
                AND ST_Close IS NOT NULL
    )
SELECT
        YEAR(curr.TradeDate) AS Year
      , MONTH(curr.TradeDate) AS Month
      , curr.TickerSymbol
      , curr.ST_Close AS CurrentMonthClose
      , prev.ST_Close AS PriorMonthClose
FROM daily_close AS curr
LEFT JOIN daily_close AS prev ON
            prev.TickerSymbol = curr.TickerSymbol
            AND prev.TradeDate < DATEADD(month, -1, DATEADD(day, 1, curr.TradeDate))
            AND prev.TradeDate >= DATEADD(month, -2, DATEADD(day, 1, curr.TradeDate))
            AND prev.day_num = 1
WHERE 
    curr.day_num = 1
ORDER BY
      Year
    , Month
    , TickerSymbol;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM