【发布时间】:2017-11-15 14:14:38
【问题描述】:
我正在尝试对 StockData 表执行 OHCL sql 查询 (SQL Server 2012)。每天有数千行添加到表中,我想获取每天的开盘价、最高价、最低价和收盘价数据。
创建表sql如下:
CREATE TABLE [dbo].[StockData](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[StockExchangeID] [bigint] NOT NULL,
[DataDateTime] [datetime] NOT NULL,
[ExportCost] [bigint] NOT NULL,
CONSTRAINT [PK_StockData] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
使用下面的查询,我可以获得最高、最低和平均,但我很难获得当天 ExportCost 的打开(基于 DataDateTime 的最早 ExportCost)和关闭(基于 DataDateTime 的最新 ExportCost)。
到目前为止,我的查询如下。如果有更有效的方法,欢迎提出任何建议。
DECLARE @IntervalDays INT, @StartDate DATETIME, @EndDate DATETIME;
SET @IntervalDays = 1;
SET @StartDate = '01/01/2017'
SET @EndDate = '01/01/2018'
-- Create the database table
SELECT
StockExchangeID,
DATEADD(DAY, DATEDIFF(DAY,0,[DataDateTime]) / @IntervalDays * @IntervalDays, 0) AS [DateDay],
MAX(ExportCost) AS DayHigh,
MIN(ExportCost) AS DayLow,
AVG(ExportCost) AS DayAverage,
'??????????' As DayOpen, --Not sure how to get the start price for the day i.e. ExportCost for the first record for that day based on [DataDateTime]
'??????????' As DatClose
FROM StockData
WHERE [DataDateTime] >= @StartDate AND [DataDateTime] <= @EndDate
GROUP BY DATEADD(DAY, DATEDIFF(DAY,0,[DataDateTime]) / @IntervalDays * @IntervalDays, 0), StockExchangeID
ORDER BY [DateDay]
【问题讨论】:
-
哪个版本的sql server?
-
/ @IntervalDays * @IntervalDays应该达到什么目的? -
Sql-server 2012 及更高版本支持 FIRST_VALUE、LAST_VALUE。检查答案stackoverflow.com/questions/41840829/… 以查看 GROUP BY 的用法
-
SQL Server 2012.
标签: sql sql-server tsql