Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将结果过滤为每N秒读取一次的存储过程_Sql_Sql Server - Fatal编程技术网

Sql 将结果过滤为每N秒读取一次的存储过程

Sql 将结果过滤为每N秒读取一次的存储过程,sql,sql-server,Sql,Sql Server,我需要查询一个包含时间序列记录的表,并过滤结果以每N秒返回一个读数 例如,返回StartDate和EndDate之间的记录,但不返回每条记录,每3600秒返回一条记录,因此每小时读取一次 在.NET中,我可以使用这样的代码来实现这一点 var TimeStepResults = allResults.Aggregate((x, y) => Math.Abs(x.From.Ticks - counter) < Math.Abs(y.From.Ticks - counter)

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

例如,返回StartDate和EndDate之间的记录,但不返回每条记录,每3600秒返回一条记录,因此每小时读取一次

在.NET中,我可以使用这样的代码来实现这一点

var TimeStepResults = allResults.Aggregate((x, y) => 
    Math.Abs(x.From.Ticks - counter) < Math.Abs(y.From.Ticks - counter) ? x : y);
var TimeStepResults=allResults.Aggregate((x,y)=>
Math.Abs(x.From.Ticks-counter)
但是,我不希望返回数百万条记录,然后每小时或30分钟提取一条记录,我更希望只返回存储过程中经过过滤的记录

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

如果我正确读取了您的C代码,它将查找
From
值最接近
计数器的行。在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
查询使用convert分区(varchar(13),[from],120)
每小时创建一行。
convert
函数将
[from]
列格式化为
yyyy-mm-dd-HH
datetime,如
2015-07-18 11

如果我正确读取了您的C代码,它将查找
From
值最接近
计数器的行。在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
查询使用convert分区(varchar(13),[from],120)
每小时创建一行。
convert
函数将
[from]
列格式化为
yyyy-mm-dd-HH
datetime,如
2015-07-18 11


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


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

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


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

在开始日期和结束日期之间?不是开始时间和结束时间?在开始日期和结束日期之间?不是开始时间和结束时间?这看起来是一个很好的解决方案,我只是想在它完成之前解决一件事。我们被传递了一个开始和结束日期时间,一个我们在查询中使用的id,以及我们应该过滤结果的秒数,所以最常见的是3600,表示我们应该每小时返回一个结果。这个查询听起来很适合这种情况。但是如果我们超过1800,每30分钟显示一次呢?我可以坚持一个固定的选项列表,比如每1分钟、30分钟、小时、天等,但这个查询如何允许我提供其他过滤值?这看起来是一个很好的解决方案,我只是想在完成之前解决一件事。我们被传递了一个开始和结束日期时间,一个我们在查询中使用的id,以及我们应该过滤结果的秒数,所以最常见的是3600,表示我们应该每小时返回一个结果。这个查询听起来很适合这种情况。但是如果我们超过1800,每30分钟显示一次呢?我可以坚持一个固定的选项列表,比如每1分钟、每30分钟、每小时、每一天等等,但是这个查询如何允许我提供那些其他的筛选值呢?