Sql server 使用T-SQL将OHLC股票市场数据分为多个时间段

Sql server 使用T-SQL将OHLC股票市场数据分为多个时间段,sql-server,tsql,group-by,timestamp,finance,Sql Server,Tsql,Group By,Timestamp,Finance,我正在使用SQL Server 2008 R2,需要创建按时间间隔分组的新表 这些数据是来自股票市场指数的数据。我有1分钟间隔的数据,现在我需要5、10、15、30、45、60…分钟间隔的数据。我的主键是时间戳 我的问题是:如何查询1分钟数据表以返回按特定时间间隔(例如5分钟间隔)分组的数据 查询必须返回该特定组中的最高、最低、最后和第一个值,最重要的是,还必须返回该组中时间戳的最后一个条目 我对SQL语言非常陌生,并尝试了许多在网上找到的代码,但我无法准确返回所需的结果 数据: TimeSta

我正在使用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
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 |....|....|...|...
所需的查询结果(5分钟):

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
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中,查找第一行和最后一行很困难。这里有一种使用
行号的方法

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)

欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(
{}
),以很好地格式化和语法突出显示它!谢谢你,安多玛,这正是我需要的。