Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Database_Datetime_Sql Server 2008 R2 - Fatal编程技术网

SQL每n分钟选择一行

SQL每n分钟选择一行,sql,sql-server,database,datetime,sql-server-2008-r2,Sql,Sql Server,Database,Datetime,Sql Server 2008 R2,我使用的是MicrosoftSQLServer2008,有一个数据集,在很长一段时间内每隔几分钟就有一个条目。我正在使用一个程序来绘制数据,所以我需要每小时返回大约20个值。有时数据是每分钟一次,有时是每五分钟一次,有时是每8或9分钟一次,因此选择第n行不会在时间上产生均匀的分布 例如,对于2012年的一个样本,它如下所示: DateTime 2012-01-01 08:00:10.000 2012-01-01 08:08:35.000 2012-01-01 08:17:01.000 2012-

我使用的是MicrosoftSQLServer2008,有一个数据集,在很长一段时间内每隔几分钟就有一个条目。我正在使用一个程序来绘制数据,所以我需要每小时返回大约20个值。有时数据是每分钟一次,有时是每五分钟一次,有时是每8或9分钟一次,因此选择第n行不会在时间上产生均匀的分布

例如,对于2012年的一个样本,它如下所示:

DateTime
2012-01-01 08:00:10.000
2012-01-01 08:08:35.000
2012-01-01 08:17:01.000
2012-01-01 08:25:26.000
对于第二年的样本,它看起来是这样的:

DateTime
2013-07-20 08:00:00.000
2013-07-20 08:01:00.000
2013-07-20 08:02:00.000
2013-07-20 08:03:00.000
2013-07-20 08:04:00.000
SELECT * FROM [Master]
WHERE (((CAST(DATEPART(hour, DateTime)as varchar(2)))*60)
      +CAST(DATEPART(minute, DateTime)as varchar(2))) % '5' = '0' 

ORDER BY DateTime
现在我用的是这样一句话:

DateTime
2013-07-20 08:00:00.000
2013-07-20 08:01:00.000
2013-07-20 08:02:00.000
2013-07-20 08:03:00.000
2013-07-20 08:04:00.000
SELECT * FROM [Master]
WHERE (((CAST(DATEPART(hour, DateTime)as varchar(2)))*60)
      +CAST(DATEPART(minute, DateTime)as varchar(2))) % '5' = '0' 

ORDER BY DateTime
这在2013年7月很有效,但我错过了2012年的大部分要点,因为它返回了这个

DateTime
2012-01-01 08:00:10.000
2012-01-01 08:25:26.000
2012-01-01 08:50:43.000
2012-01-01 09:15:59.000
2012-01-01 10:40:14.000
2012-01-01 11:05:30.000
有什么更好的方法可以做到这一点


编辑:该表有一个DateTime列和一个pressure列,我需要根据日期和时间输出和绘制压力图

因为它们可以在几个小时内随机出现,这应该可以满足您的需要:

Declare @NumberPerHour Int = 20

;With Cte As
(
    Select  DateTime, Row_Number() Over (Partition By DateDiff(Hour, 0, DateTime) Order By NewId()) RN
    From    Master
)
Select  DateTime
From    Cte
Where   RN <= @NumberPerHour
Order By DateTime Asc

这将按小时对行进行分组,并为它们分配一个随机的行号ID,并且只提取那些行号小于每小时要查找的行号的行。

因为它们可以在小时内随机出现,这应该可以满足您的需要:

Declare @NumberPerHour Int = 20

;With Cte As
(
    Select  DateTime, Row_Number() Over (Partition By DateDiff(Hour, 0, DateTime) Order By NewId()) RN
    From    Master
)
Select  DateTime
From    Cte
Where   RN <= @NumberPerHour
Order By DateTime Asc


这将按小时对行进行分组,并为它们分配一个随机的行号ID,并且只提取行号小于每小时要查找的行号的行。

您只是想生成时间吗?或者,您希望从样本数据中得到什么样的输出?您实际上想从数据中得到什么?我在一个名为“压力”的列中输出值,并绘制压力与时间的关系图。对不起,不清楚!我想我知道你在问什么。是必须在一个小时内均匀分布20列,还是可以在一个小时内随机分布?@Clara噢,那就不同了。那么,你在寻找一种生成时间度量的方法吗?你只是想生成时间吗?或者,您希望从样本数据中得到什么样的输出?您实际上想从数据中得到什么?我在一个名为“压力”的列中输出值,并绘制压力与时间的关系图。对不起,不清楚!我想我知道你在问什么。是必须在一个小时内均匀分布20列,还是可以在一个小时内随机分布?@Clara噢,那就不同了。那么,你在寻找一种生成时间度量的方法吗?嗯,这几乎是可行的,但它给出了20个连续的时间值,从一个小时间隔内的随机时间开始,而不是随机分布在一个小时内的20个值,并且它会偶尔遗漏整个小时。你有没有遗漏小时的数据?Order By Rand应该为小时内的用户随机分配行号ID,由于末尾的Order By语句,它可能看起来是连续的。是的,我有2014年每分钟的数据,但它一次跳过整个小时,但在2012年运行良好,没有看到一些示例数据,我不确定如何纠正该问题。对于缺少的一些小时,您是否可以从主表中选择该时间范围内的数据?通过使用NewID而不是Rand进行修复:嗯,这几乎可以工作,但它提供了20个连续的时间值,从小时间隔内的随机时间开始,而不是在一小时内随机分布20个值,它有时会漏掉整小时。你有它漏掉的小时数的数据吗?Order By Rand应该为小时内的用户随机分配行号ID,由于末尾的Order By语句,它可能看起来是连续的。是的,我有2014年每分钟的数据,但它一次跳过整个小时,但在2012年运行良好,没有看到一些示例数据,我不确定如何纠正该问题。对于缺少的某些小时,您是否可以从主表中选择该时间范围内的数据?使用NewID而不是Rand修复了该问题: