存储过程,每隔n秒将结果过滤一次

时间:2015-07-18 08:19:59

标签: sql sql-server

我需要查询包含时间序列记录的表,并过滤结果以每隔n秒返回一个读数。

例如,返回StartDate和EndDate之间的记录,但不返回每条记录,每3,600秒返回一条记录,每小时读一次。

在.NET中,我可以使用这样的代码来完成此任务。

var TimeStepResults = allResults.Aggregate((x, y) => 
    Math.Abs(x.From.Ticks - counter) < Math.Abs(y.From.Ticks - counter) ? x : y);

但是我不想返回数百万条记录,然后每小时或30分钟取出一条记录,我宁愿只从存储过程中返回过滤后的记录。

有人可以建议如何做到这一点吗?

2 个答案:

答案 0 :(得分:0)

如果我正确阅读了您的C#代码,它会寻找From值最接近counter的行。在SQL中,您可以这样做:

declare @counter datetime = '2015-07-18 11:00'

select  convert(varchar(13), [from], 120)
,       col1
from    (
        select  row_number() over (
                    partition by convert(varchar(13), [from], 120) -- yyyy-mm-dd HH
                    order by abs(datediff(second, [from], @counter))
                    ) as rn
        ,       *
        from    Measurements
        ) as SubQueryAlias
where   rn = 1 -- only row closest to @counter per hourly group

查询使用partition by convert(varchar(13), [from], 120)每小时创建一行。 convert函数将[from]列格式化为yyyy-mm-dd HH日期时间,例如2015-07-18 11

Example at SQL Fiddle.

答案 1 :(得分:0)

我更愿意为此(.net作业或SQL作业)创建一个每30分钟运行一次的作业。它可以调用一些将返回您首选结果的存储过程。

如果出现错误,您可以写入系统事件或表进行跟踪。