大佬教程收集整理的这篇文章主要介绍了sql-server – 根据每隔n个时间间隔选择行,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
SELEct timestamp,value from myTable where configID=3 AND{most recent for 15 min interval}
我有一个CTE查询,它返回间隔时间间隔的多行
WITH Time_Interval(timestamp,value,minutes) AS ( SELEct timestamp,DatePart(minute,timestamp) from myTable Where timestamp >= '12/01/2012' and timestamp <= 'Jan 10,2013' and ConfigID = 435 and (DatePart(minute,timestamp) % 15) = 0 ) SELEct timestamp,minutes from Time_Interval group by minutes,timestamp order by timestamp
如:
2012-12-19 18:15:22.040 6.98 15 2012-12-19 18:15:29.887 6.98 15 2012-12-19 18:15:33.480 7.02 15 2012-12-19 18:15:49.370 7.01 15 2012-12-19 18:30:41.920 6.95 30 2012-12-19 18:30:52.437 6.93 30 2012-12-19 19:15:18.467 7.13 15 2012-12-19 19:15:34.250 7.11 15 2012-12-19 19:15:49.813 7.12 15
但是可以看出,第一个15分钟间隔有4个,下一个间隔有2个等等……更糟糕的是,
如果没有在15分钟的确切时间戳上获得数据,那么将没有价值.
我想要的是十五分钟间隔的最新值…如果该间隔的唯一数据发生在间隔开始后的1秒内.
我正在考虑Lead / over但是……这些行并没有这样的方式.主键是一个bigInt,是一个聚簇索引. timstamp列和ConfigID列都是Indexed.上面的查询在一秒钟内返回4583行.
谢谢你的帮助.
;WITH Interval_Helper([minute],minute_group) AS ( SELECT 0,1 UNION SELECT 1,1 UNION SELECT 2,1 UNION SELECT 3,1 UNION SELECT 4,1 UNION SELECT 5,1 UNION SELECT 6,1 UNION SELECT 7,1 UNION SELECT 8,1 UNION SELECT 9,1 UNION SELECT 10,1 UNION SELECT 11,1 UNION SELECT 12,1 UNION SELECT 13,1 UNION SELECT 14,1 UNION SELECT 15,2 UNION SELECT 16,2 UNION SELECT 17,2 UNION SELECT 18,2 UNION SELECT 19,2 UNION SELECT 20,2 UNION SELECT 21,2 UNION SELECT 22,2 UNION SELECT 23,2 UNION SELECT 24,2 UNION SELECT 25,2 UNION SELECT 26,2 UNION SELECT 27,2 UNION SELECT 28,2 UNION SELECT 29,2 UNION SELECT 30,3 UNION SELECT 31,3 UNION SELECT 32,3 UNION SELECT 33,3 UNION SELECT 34,3 UNION SELECT 35,3 UNION SELECT 36,3 UNION SELECT 37,3 UNION SELECT 38,3 UNION SELECT 39,3 UNION SELECT 40,3 UNION SELECT 41,3 UNION SELECT 42,3 UNION SELECT 43,3 UNION SELECT 44,3 UNION SELECT 45,4 UNION SELECT 46,4 UNION SELECT 47,4 UNION SELECT 48,4 UNION SELECT 49,4 UNION SELECT 50,4 UNION SELECT 51,4 UNION SELECT 52,4 UNION SELECT 53,4 UNION SELECT 54,4 UNION SELECT 55,4 UNION SELECT 56,4 UNION SELECT 57,4 UNION SELECT 58,4 UNION SELECT 59,4 ),Time_Interval([timestamp],[date],[hour],minute_group) AS ( SELECT A.1652664876,A.value,CONVERT(smalldatetiR_890_11845@e,CONVERT(char(10),A.1652664876,101)),DATEPART(HOUR,A.1652664876),B.minute_group FROM myTable A JOIN Interval_Helper B ON (DATEPART(minute,A.1652664876)) = B.[minute] AND A.1652664876 >= '12/01/2012' AND A.1652664876 <= '01/10/2013' AND A.ConfigID = 435 ),Time_Interval_TimeGroup([date],[minute],Maxtimestamp) AS ( SELECT [date],minute_group,MAX(1652664876) as Maxtimestamp FROM Time_Interval GROUP BY [date],minute_group ),Time_Interval_TimeGroup_Latest(Maxtimestamp,MaxIdX) AS ( SELECT Maxtimestamp,MAX(idX) as MaxIdx FROM myTable A JOIN Time_Interval_TimeGroup B ON A.1652664876 = B.Maxtimestamp GROUP BY Maxtimestamp ) select a.* FROM myTable A JOIN Time_Interval_TimeGroup_Latest B ON A.idx = B.MaxIdx ORDER BY A.[timestamp]
这是另一个来自@mntManChris的聪明时间组功能:
create functION dbo.fgetTimeGroup (@DatePart Tinyint,@Date datetiR_890_11845@E) RETURNS int AS BEGIN RETURN CASE @DatePart WHEN 1 THEN DATEPART(mi,@DatE) WHEN 2 THEN DATEPART(mi,@DatE)/5 + 1 -- 5 min WHEN 3 THEN DATEPART(mi,@DatE)/15 + 1 -- 15 min WHEN 4 THEN DATEPART(mi,@DatE)/30 + 1 -- 30 min WHEN 5 THEN DATEPART(hh,@DatE) -- hr WHEN 6 THEN DATEPART(hh,@DatE)/6 + 1 -- 6 hours WHEN 7 THEN DATEPART(hh,@DatE)/12 + 1 -- 12 hours WHEN 8 THEN DATEPART(d,@DatE) -- day ELSE -1 END END
以上是大佬教程为你收集整理的sql-server – 根据每隔n个时间间隔选择行全部内容,希望文章能够帮你解决sql-server – 根据每隔n个时间间隔选择行所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。