sql查询以获取具有时间间隔的数据

时间:2012-08-23 17:09:15

标签: sql sql-server-2008

我有一个数据表,其中包含日期时间类型的字段,我每分钟都获得3-5个条目的数据,即

23/08/2012 18:05:01,
23/08/2012 18:05:15,
23/08/2012 18:05:26,
23/08/2012 18:05:44,
23/08/2012 18:05:59

现在我需要每隔5分钟获取一条记录数据

任何人都可以帮助我,我该怎么做呢

由于

3 个答案:

答案 0 :(得分:4)

我不确定我是否完全理解您的要求,但以下将返回分钟为5的倍数的任何值的一条记录:

select *
from
(
    select *, 
       datepart(minute, yourDate) mn, 
       row_number() over(partition by datepart(minute, yourDate) order by yourDate) rn
    from yourTable
) x
where (mn % 5) = 0
    and rn = 1

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

给出一个看起来像这样的表:

create table some_event_log_table
(
  id             int      not null identity(1,1) primary key clustered ,
  dateTimeLogged datetime not null ,
  ... some more columns here --
)

然后像下面这样的查询(http://sqlfiddle.com/#!3/5ad56/1/0处的SqlFiddle)应该可以解决这个问题:

select dateLogged    = convert(date,dateTimeLogged),
       periodID      = datediff(minute,
                         convert(date,dateTimeLogged) ,
                         dateTimeLogged
                         ) / 5   ,
       period_start  = convert(time,
                         dateadd(minute,
                           datediff(minute,
                             convert(date,dateTimeLogged),
                             dateTimeLogged
                             ) ,
                           convert(datetime,convert(date,dateTimeLogged))
                           )
                         ) ,
       events_logged = count(*)
from some_event_log_table
group by convert(date,dateTimeLogged),
         datediff(minute,
           convert(date,dateTimeLogged) ,
           dateTimeLogged
           ) / 5   ,
         convert(time,
           dateadd(minute,
             datediff(minute,
               convert(date,dateTimeLogged),
               dateTimeLogged
               ) ,
             convert(datetime,convert(date,dateTimeLogged))
             )
           )

我们在这里的内容如下:

  • 首先,我们将每天分为5分钟。每天有288个这样的5分钟时段。

  • 然后,对于表格中的每一行,我们

    • 计算行dateLogged,该行的报告日期( sans 时间)。

    • 计算列periodID,其值为0-287,表示该行每天所处的288个5分钟时段中的哪一个。

    • 计算列periodStart,即该行所属期间的开始时间。

  • 最后,我们

    • group by汇总,在一天内为每个时段创建1个组,对我们刚为每一行计算的3个值进行分组。
    • 在列order bydateLogged上使用periodID对结果集进行排序。

这就是它的全部内容。一旦你把它分解,真的很简单。

答案 2 :(得分:0)

问题在于你有2个periodid 218行,平均周期218怎么样?