使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内

Posted

技术标签:

【中文标题】使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内【英文标题】:Group OHLC-Stockmarket Data into multiple timeframes with T-SQL 【发布时间】:2012-03-09 13:57:58 【问题描述】:

我使用的是 SQL Server 2008 R2,需要创建按时间间隔分组的新表。

数据来自股票市场指数。我有 1 分钟间隔的数据,现在我需要 5,10,15,30,45,60... 分钟间隔的数据。我的主键是时间戳

我的问题是:如何查询 1 分钟数据表以返回按特定时间间隔(例如 5 分钟间隔)分组的数据。

查询必须返回该特定组中的最高、最低、最后和第一个值,最重要的是还必须返回该组中时间戳的最后一个条目。

我对 SQL 语言非常陌生,并且尝试过在网上找到的大量代码,但我无法准确返回所需的结果。

数据:

TimeStamp          | Open | High | Low | Close
2012-02-17 15:15:0 | 102  | 110  |100  |105
2012-02-17 15:16:0 |106   |112   |105  |107
2012-02-17 15:17:0 | 106  |110   |98   |105
2012-02-17 15:18:0 |105   |109   |104  |106
2012-02-17 15:19:0 |107   |112   |107  |112
2012-02-17 15:20:0 |115   |125   |115  |124

所需的查询结果(5 分钟):

Timestamp       |Open|High|Low|Close
2012-02-15:19:0 |102 |125 |98 |124
2012-02-15:24:0 |115.|....|...|...
2012-02-15:29:0 |....|....|...|...

【问题讨论】:

欢迎使用 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( ) 在编辑器工具栏上以很好地格式化和语法突出显示它! 【参考方案1】:

当您将datetime 转换为float 时,您将获得天数。如果将其乘以24 * 12,您将得到多个 5 分钟间隔。所以如果你分组:

cast(cast(timestamp as float) * 24 * 12 as int)

你可以每五分钟做一次聚合:

select  min(timestamp)
,       max(high) as Highest
,       min(low) as Lowest
from    @t
group by
        cast(cast(timestamp as float) * 24 * 12 as int)

在 SQL Server 中查找第一行和最后一行是很棘手的。这是使用row_number的一种方式:

select  min(timestamp)
,       max(high) as Highest
,       min(low) as Lowest
,       min(case when rn_asc = 1 then [open] end) as first
,       min(case when rn_desc = 1 then [close] end) as Last
from    (
        select  row_number() over (
                    partition by cast(cast(timestamp as float) * 24 * 12 as int)
                    order by timestamp) as rn_asc
        ,       row_number() over (
                    partition by cast(cast(timestamp as float) * 24 * 12 as int)
                    order by timestamp desc) as rn_desc
        ,       *
        from    @t
        ) as SubQueryAlias
group by
        cast(cast(timestamp as float) * 24 * 12 as int)

这是working example at SE Data.

【讨论】:

谢谢 Andomar,这正是我所需要的。

以上是关于使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内的主要内容,如果未能解决你的问题,请参考以下文章

高级T-SQL进阶系列 :使用 CROSS JOIN 介绍高级T-SQL

使用 T-SQL 中的一个参数将多个值插入多行

高级T-SQL进阶系列 下篇:使用 CROSS JOIN 介绍高级T-SQL

需要帮助将 T-SQL 转换为 PostgreSQL

使用 T-SQL 生成随机字符串

将 T-SQL 交叉应用转换为 Oracle