sql-server - 使用 T-SQL 将 OHLC 股票市场数据分组为多个时间范围

标签 sql-server tsql group-by timestamp finance

我正在使用 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 |....|....|...|...

最佳答案

当您将日期时间转换为浮点时,您会得到天数。如果将其乘以 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.

关于sql-server - 使用 T-SQL 将 OHLC 股票市场数据分组为多个时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9340602/

相关文章:

sql - Tsql,有没有办法使用行中的现有字段作为同一行中另一个字段中字符串的一部分来更新行?

Mysql:返回具有不同键的所有行,如果相同的键则取具有最高时间戳的行

c# - C++/.net (Framework 2.0) 使用用户名和密码的 MS SQL 数据库 Windows 身份验证

mysql - 在多列条件上使用内连接与使用 WHere 子句

c# - 如何使用c#在参数中传递转换表达式?

asp.net - 如何优化 T-SQL 查询

mysql - SQL:在一条语句中进行多个分组

c# - 如何通过该嵌套列表对具有 List<string> 属性的 List<T> 进行分组?

sql - 如何组合 2 位列

sql-server - 带有 WHERE 子句的 LEFT OUTER JOIN