sql-server - 如何从 SQL Server 查询 Open-high-low-close (OHLC) 数据

标签 sql-server group-by finance stocks

我正在尝试直接从数据库中检索开盘高低收盘 (OHLC) 图表的数据,这是您看到的那种股票图表。这可能吗?如果可能,如何?

我有一个这样的表(简化版):

日期 |价格 |价格类型

每天都会创建一个记录,我会按月/年报告,而不是像股票那样按天报告。

我想查询这样的东西:

SELECT PriceType, MAX(Price) as High, MIN(Price) as Low, [Price of first item of month] as Open, [Price of last item of month] as Close GROUP BY PriceType, 年(日期),月(日)

为了访问 SQL Server,我使用 LLBLGen,因此基于该技术的答案会很棒,通用 SQL 服务器也可以!

它是 SQL 2005,但 2008 也是一个选项。

谢谢。

最佳答案

这似乎有效。很可能有一种不那么冗长的方法来做到这一点。

--create test data
CREATE TABLE #t
(priceDate DATETIME
,price MONEY
,priceType CHAR(1)
)

INSERT #t
      SELECT '20090101',100,'A'
UNION SELECT '20090102',500,'A'
UNION SELECT '20090103',20 ,'A'
UNION SELECT '20090104',25 ,'A'
UNION SELECT '20090105',28 ,'A'
UNION SELECT '20090131',150,'A'


UNION SELECT '20090201',501,'A'
UNION SELECT '20090203',21 ,'A'
UNION SELECT '20090204',26 ,'A'
UNION SELECT '20090205',29 ,'A'
UNION SELECT '20090228',151,'A'


UNION SELECT '20090101',100,'B'
UNION SELECT '20090102',500,'B'
UNION SELECT '20090103',20 ,'B'
UNION SELECT '20090104',25 ,'B'
UNION SELECT '20090105',28 ,'B'
UNION SELECT '20090131',150,'B'


UNION SELECT '20090201',501,'B'
UNION SELECT '20090203',21 ,'B'
UNION SELECT '20090204',26 ,'B'
UNION SELECT '20090205',29 ,'B'
UNION SELECT '20090228',151,'B'

--query
;WITH rangeCTE
AS
(
        SELECT  MIN(priceDate) minDate
                ,MAX(priceDate) maxDate
        FROM #t
)
,datelistCTE
AS
(
        SELECT CAST(CONVERT(CHAR(6),minDate,112) + '01' AS DATETIME) AS monthStart
               ,DATEADD(mm,1,CAST(CONVERT(CHAR(6),minDate,112) + '01' AS DATETIME)) -1 AS monthEnd
               ,1 AS monthID
        FROM rangeCTE

        UNION ALL

        SELECT DATEADD(mm,1,monthStart)
               ,DATEADD(mm,2,monthStart) - 1
               ,monthID + 1
        FROM datelistCTE
        WHERE monthStart <= (SELECT maxDate FROM rangeCTE)
)
,priceOrderCTE
AS
(
        SELECT * 
               ,ROW_NUMBER() OVER (PARTITION BY monthID, priceType
                                   ORDER BY priceDate
                                   ) AS rn1
               ,ROW_NUMBER() OVER (PARTITION BY monthID, priceType
                                   ORDER BY priceDate DESC
                                   ) AS rn2
               ,ROW_NUMBER() OVER (PARTITION BY monthID, priceType
                                   ORDER BY price DESC
                                   ) AS rn3                                   
               ,ROW_NUMBER() OVER (PARTITION BY monthID, priceType
                                   ORDER BY price 
                                   ) AS rn4
        FROM datelistCTE AS d
        JOIN #t          AS t
        ON t.priceDate BETWEEN d.monthStart AND d.monthEnd
        WHERE monthStart <= (SELECT maxDate FROM rangeCTE)
)
SELECT o.MonthStart
       ,o.priceType
       ,o.Price AS opening
       ,c.price AS closing
       ,h.price AS high
       ,l.price AS low
FROM priceOrderCTE AS o
JOIN priceOrderCTE AS c
ON   c.priceType = o.PriceType 
AND  c.monthID   = o.MonthID
JOIN priceOrderCTE AS h
ON   h.priceType = o.PriceType 
AND  h.monthID   = o.MonthID
JOIN priceOrderCTE AS l
ON   l.priceType = o.PriceType 
AND  l.monthID   = o.MonthID
WHERE o.rn1 = 1
AND   c.rn2 = 1
AND   h.rn3 = 1
AND   l.rn4 = 1

关于sql-server - 如何从 SQL Server 查询 Open-high-low-close (OHLC) 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1491879/

相关文章:

sql - 在 SQL 中为表行设置限制

sql - 改进 xpath 评估的 SQL 查询

sql-server - 无法在 WSO2 数据服务服务器上加载 SQL Server 的驱动程序

sql - 选择艺术家专辑列表并显示每个专辑中已请求艺术家和专辑的轨道数

r - 基于 xts 对象的购买填充保留

c# - 在 C# 中从快照恢复 SQL Server 数据库

mysql - 使用 GROUP BY 时包括缺失的(零计数)行

sql - 选择按时间分组的午夜数据

php - 以编程方式访问货币汇率

api - 雅虎金融 API 股票返回股票期权数据吗?