SQL每n分钟选择一行

时间:2014-07-25 14:02:27

标签: sql sql-server database datetime sql-server-2008-r2

我正在使用Microsoft SQL Server 2008,并且拥有一个数据集,该数据集在很长一段时间内每隔几分钟就有一个条目。我正在使用程序来绘制数据图,所以我需要每小时返回大约20个值。有时几天数据是每分钟,有时每五分钟,有时每8或9分钟,因此选择每一行不会随着时间的推移而均匀分布

例如,对于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

这在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列和一个压力列,我需要输出两者和图表压力的日期和时间。

1 个答案:

答案 0 :(得分:4)

因为它们可以随机播放,所以这应该适用于你需要的东西:

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

这会按小时对行进行分组,并为其分配一个随机的Row_Number ID,并且只会提取Row_Number小于您每小时所需数量的行。