使用T-SQL窗口函数从1分钟的数据中检索5分钟的平均值

问题描述 投票:3回答:1

我有一个数据库表,其中包含一分钟的打开,关闭,高,低,成交量值,以获取证券。我正在使用SQL Server 2017,但可以选择使用2019 RC。

我正在尝试找到一个有效的SQL Server查询,可以将这些查询聚合到5分钟的窗口中,其中:

  • 打开=窗口的第一个打开值
  • 关闭=窗口的最后关闭值
  • 最高=最大窗口的最高值
  • Low = min窗口的下限值
  • Volume =整个窗口的平均体积

理想情况下,此查询将考虑数据中的差异,即基于日期计算,而不是对前/后行进行计数。

例如说我有(这是6分钟的数据):

|时间|开启|关闭|高|低|数量| ------------------ | ------ | ------- | ------ | ----- |- ------ || 2019-10-30 09:30 | 5 | 10 | 15 | 1 | 125000 || 2019-10-30 09:31 | 10 | 15 | 20 | 5 | 100000 || 2019-10-30 09:32 | 15 | 20 | 25 | 10 | 120000 || 2019-10-30 09:33 | 20 | 25 | 30 | 15 | 10000 || 2019-10-30 09:34 | 20 | 22 | 40 | 2 | 13122 || 2019-10-30 09:35 | 22 | 30 | 35 | 4 | 15000 |未考虑在内,因为这将是下一个5分钟窗口的第一行

我正在尝试编写一个查询,该查询将给我(这是5分钟汇总的第一个示例):

|时间|开启|关闭|高|低|数量| ------------------ | ------ | ------- | ------ | ----- |- ------- || 2019-10-30 09:30 | 5 | 30 | 40 | 1 | 50224.4 |

任何提示?我正在用OVER子句及其PARTITION / RANGE选项将我的头撞在墙上]

sql sql-server window-functions algorithmic-trading stockquotes
1个回答
1
投票

您希望每隔5分钟分析一次数据。您可以将窗口函数与以下分区子句一起使用:

partition by datepart(year, t.[time]),
    datepart(month, t.[time]),
    datepart(day, t.[time]),
    datepart(hour, t.[time]),
    (datepart(minute, t.[time]) / 5)

查询:

select *
from (
    select  
        t.time,
        row_number(open) over(
            partition by datepart(year, t.[time]),
                datepart(month, t.[time]),
                datepart(day, t.[time]),
                datepart(hour, t.[time]),
                (datepart(minute, t.[time]) / 5)
            order by t.[time]
        ) rn
        first_value(open) over(
            partition by datepart(year, t.[time]),
                datepart(month, t.[time]),
                datepart(day, t.[time]),
                datepart(hour, t.[time]),
                (datepart(minute, t.[time]) / 5)
            order by t.[time]
        ) open,
        last_value(close) over(
            partition by datepart(year, t.[time]),
                datepart(month, t.[time]),
                datepart(day, t.[time]),
                datepart(hour, t.[time]),
                (datepart(minute, t.[time]) / 5)
            order by t.[time]
        ) close,
        max(high) over (
            partition by datepart(year, t.[time]),
                datepart(month, t.[time]),
                datepart(day, t.[time]),
                datepart(hour, t.[time]),
                (datepart(minute, t.[time]) / 5)
        ) high,
        min(low) over (
            partition by datepart(year, t.[time]),
                datepart(month, t.[time]),
                datepart(day, t.[time]),
                datepart(hour, t.[time]),
                (datepart(minute, t.[time]) / 5)
        ) high,
        avg(volume) over (
            partition by datepart(year, t.[time]),
                datepart(month, t.[time]),
                datepart(day, t.[time]),
                datepart(hour, t.[time]),
                (datepart(minute, t.[time]) / 5)
        ) volume
    from mytable t
) t
where rn = 1
© www.soinside.com 2019 - 2024. All rights reserved.