我有一个包含大量数据的表,这些数据存储在更改中。
tbl_bigOne
----------
timestamp | var01 | var02 | ...
2016-01-14 15:20:21 | 10.1 | 100.6 | ...
2016-01-14 15:20:26 | 11.2 | 110.3 | ...`
2016-01-14 15:21:27 | 52.1 | 620.1 | ...
2016-01-14 15:35:00 | 13.5 | 230.6 | ...
...
2016-01-15 09:18:01 | 94.4 | 140.0 | ...
2016-01-15 10:01:15 | 105.3 | 188.7 | ...
...
and so on for years of data
我想要获得的是一个查询/存储过程,它给出了两个日期时间引用(date_from和date_to),它们提供了所需的选定数据。 现在,刚刚提到的查询非常简单,我想要实现的是设置每天返回的最大行数(如果数据可用),同时进行值的平均值。
我们举几个例子:
date_from: 2016-01-14 00:00:00
date_to: 2016-01-20 23:59:59
max_points:12
在这种情况下,时间窗口是7天,在这一天我希望7天窗口的每一天最多有12行,最多总共84行,同时从所有的平均值分组完成后,每天的数据现在被12分区。 可以看到此分区,就好像每个小时的特定日期数据的平均值一样,生成一天所需的12行中的一行。
date_from: 2016-01-14 00:00:00
date_to: 2016-01-14 23:59:59
max_points:1440
在这种情况下,时间窗口值一天,如果可用,我希望在所选时间段内最多有1440行(每天)。
这样,参数定义了每天的最大行数。最短时间窗口是一天没有低于该值。
使用TSQL可以实现这样的目标吗?
谢谢。
编辑以处理@Thorsten Kettner提出的意见
答案 0 :(得分:0)
使用分析函数ROW_NUMBER()
对每天匹配的行进行编号。然后只保持行达到给定的限制。如果您希望在存在超过需要的行时任意选择行,则使用NEWID()
以随机顺序对行进行编号。
select timestmp, var01, var02, var03
from
(
select
mytable.*,
row_number() over (partition by convert(date, timestmp) order by newid()) as rn
from mytable
where convert(date, timestmp) between @start_date and @end_date
) numbered
where rn <= @limit
order by timestmp;