MsSQL   发布时间:2022-05-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了sql-server – 根据每隔n个时间间隔选择行大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表,主键(bigint),日期时间,值,ForeignKey到配置表,@R_729_11262@00,000行.我希望能够获得一个可变时间间隔的行.例如.
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行.

谢谢你的帮助.

解决方法

尝试这个尺寸.当给定间隔有多个时间戳时,它甚至会处理返回一行的实例.
注意:这假设您的Bigint PK列命名为:idx.如果不是,请替换“idx”.
;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,请注明来意。