我正在使用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列和一个压力列,我需要输出两者和图表压力的日期和时间。
答案 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
小于您每小时所需数量的行。