我有一个数据库表,其中包含一分钟的打开,关闭,高,低,成交量值,以获取证券。我正在使用SQL Server 2017,但可以选择使用2019 RC。
我正在尝试找到一个有效的SQL Server查询,可以将这些查询聚合到5分钟的窗口中,其中:
理想情况下,此查询将考虑数据中的差异,即基于日期计算,而不是对前/后行进行计数。
例如说我有(这是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选项将我的头撞在墙上]
您希望每隔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