TSQL将查询返回的数据量减少到参数化定义的样本

时间:2016-01-14 11:51:16

标签: sql sql-server tsql stored-procedures

我有一个包含大量数据的表,这些数据存储在更改中。

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提出的意见

1 个答案:

答案 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;