如何拉取当前和过去一个月的数据 SQL 服务器
How to pull current and past month data SQL Server
我需要列出一年中每个月(我将称为 'current' 月)的交易日期和股票收盘价以及 [= 前一个月的股票收盘价=24=]月。
我正在使用的 StockData
table 包含每个交易日期和股票代码的日期、股票最高价、最低价、开盘价、收盘价和交易量的列。
最初,我使用 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 月,我想显示股票2010年4月30日和2010年3月31日的收盘价)
关于如何做到这一点有什么想法吗?
您可以使用 window 函数和条件聚合:
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;
我需要列出一年中每个月(我将称为 'current' 月)的交易日期和股票收盘价以及 [= 前一个月的股票收盘价=24=]月。
我正在使用的 StockData
table 包含每个交易日期和股票代码的日期、股票最高价、最低价、开盘价、收盘价和交易量的列。
最初,我使用 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 月,我想显示股票2010年4月30日和2010年3月31日的收盘价)
关于如何做到这一点有什么想法吗?
您可以使用 window 函数和条件聚合:
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;